mirror of
				https://github.com/0glabs/0g-chain.git
				synced 2025-11-04 03:07:28 +00:00 
			
		
		
		
	Replace opendb package from kava with generic opendb repo (#1959)
* Upgrade ethermint * Remove opendb package from kava and add custom dbOpener function * Open metadata.db with custom opendb function
This commit is contained in:
		
							parent
							
								
									d2d661276e
								
							
						
					
					
						commit
						58d7c89f8e
					
				
							
								
								
									
										22
									
								
								.github/workflows/ci-rocksdb-build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								.github/workflows/ci-rocksdb-build.yml
									
									
									
									
										vendored
									
									
								
							@ -19,25 +19,3 @@ jobs:
 | 
				
			|||||||
        run: bash ${GITHUB_WORKSPACE}/.github/scripts/install-rocksdb.sh
 | 
					        run: bash ${GITHUB_WORKSPACE}/.github/scripts/install-rocksdb.sh
 | 
				
			||||||
      - name: build application
 | 
					      - name: build application
 | 
				
			||||||
        run: make build COSMOS_BUILD_OPTIONS=rocksdb
 | 
					        run: make build COSMOS_BUILD_OPTIONS=rocksdb
 | 
				
			||||||
  test:
 | 
					 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					 | 
				
			||||||
    steps:
 | 
					 | 
				
			||||||
      - name: install RocksDB dependencies
 | 
					 | 
				
			||||||
        run: sudo apt-get update
 | 
					 | 
				
			||||||
          && sudo apt-get install -y git make gcc libgflags-dev libsnappy-dev zlib1g-dev libbz2-dev liblz4-dev libzstd-dev
 | 
					 | 
				
			||||||
      - name: install RocksDB as shared library
 | 
					 | 
				
			||||||
        run: git clone https://github.com/facebook/rocksdb.git
 | 
					 | 
				
			||||||
          && cd rocksdb
 | 
					 | 
				
			||||||
          && git checkout $ROCKSDB_VERSION
 | 
					 | 
				
			||||||
          && sudo make -j$(nproc) install-shared
 | 
					 | 
				
			||||||
          && sudo ldconfig
 | 
					 | 
				
			||||||
      - name: checkout repo from current commit
 | 
					 | 
				
			||||||
        uses: actions/checkout@v4
 | 
					 | 
				
			||||||
        with:
 | 
					 | 
				
			||||||
          submodules: true
 | 
					 | 
				
			||||||
      - name: Set up Go
 | 
					 | 
				
			||||||
        uses: actions/setup-go@v4
 | 
					 | 
				
			||||||
        with:
 | 
					 | 
				
			||||||
          go-version-file: go.mod
 | 
					 | 
				
			||||||
      - name: run unit tests
 | 
					 | 
				
			||||||
        run: make test-rocksdb
 | 
					 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										3
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								Makefile
									
									
									
									
									
								
							@ -314,9 +314,6 @@ test-ibc: docker-build
 | 
				
			|||||||
test:
 | 
					test:
 | 
				
			||||||
	@$(GO_BIN) test $$($(GO_BIN) list ./... | grep -v 'contrib' | grep -v 'tests/e2e')
 | 
						@$(GO_BIN) test $$($(GO_BIN) list ./... | grep -v 'contrib' | grep -v 'tests/e2e')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
test-rocksdb:
 | 
					 | 
				
			||||||
	@go test -tags=rocksdb ./cmd/kava/opendb
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Run cli integration tests
 | 
					# Run cli integration tests
 | 
				
			||||||
# `-p 4` to use 4 cores, `-tags cli_test` to tell $(GO_BIN) not to ignore the cli package
 | 
					# `-p 4` to use 4 cores, `-tags cli_test` to tell $(GO_BIN) not to ignore the cli package
 | 
				
			||||||
# These tests use the `kvd` or `kvcli` binaries in the build dir, or in `$BUILDDIR` if that env var is set.
 | 
					# These tests use the `kvd` or `kvcli` binaries in the build dir, or in `$BUILDDIR` if that env var is set.
 | 
				
			||||||
 | 
				
			|||||||
@ -94,12 +94,12 @@ import (
 | 
				
			|||||||
	ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper"
 | 
						ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper"
 | 
				
			||||||
	solomachine "github.com/cosmos/ibc-go/v7/modules/light-clients/06-solomachine"
 | 
						solomachine "github.com/cosmos/ibc-go/v7/modules/light-clients/06-solomachine"
 | 
				
			||||||
	ibctm "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint"
 | 
						ibctm "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint"
 | 
				
			||||||
 | 
						"github.com/ethereum/go-ethereum/core/vm"
 | 
				
			||||||
	evmante "github.com/evmos/ethermint/app/ante"
 | 
						evmante "github.com/evmos/ethermint/app/ante"
 | 
				
			||||||
	ethermintconfig "github.com/evmos/ethermint/server/config"
 | 
						ethermintconfig "github.com/evmos/ethermint/server/config"
 | 
				
			||||||
	"github.com/evmos/ethermint/x/evm"
 | 
						"github.com/evmos/ethermint/x/evm"
 | 
				
			||||||
	evmkeeper "github.com/evmos/ethermint/x/evm/keeper"
 | 
						evmkeeper "github.com/evmos/ethermint/x/evm/keeper"
 | 
				
			||||||
	evmtypes "github.com/evmos/ethermint/x/evm/types"
 | 
						evmtypes "github.com/evmos/ethermint/x/evm/types"
 | 
				
			||||||
	"github.com/evmos/ethermint/x/evm/vm/geth"
 | 
					 | 
				
			||||||
	"github.com/evmos/ethermint/x/feemarket"
 | 
						"github.com/evmos/ethermint/x/feemarket"
 | 
				
			||||||
	feemarketkeeper "github.com/evmos/ethermint/x/feemarket/keeper"
 | 
						feemarketkeeper "github.com/evmos/ethermint/x/feemarket/keeper"
 | 
				
			||||||
	feemarkettypes "github.com/evmos/ethermint/x/feemarket/types"
 | 
						feemarkettypes "github.com/evmos/ethermint/x/feemarket/types"
 | 
				
			||||||
@ -564,8 +564,7 @@ func NewApp(
 | 
				
			|||||||
		app.precisebankKeeper, // x/precisebank in place of x/bank
 | 
							app.precisebankKeeper, // x/precisebank in place of x/bank
 | 
				
			||||||
		app.stakingKeeper,
 | 
							app.stakingKeeper,
 | 
				
			||||||
		app.feeMarketKeeper,
 | 
							app.feeMarketKeeper,
 | 
				
			||||||
		nil, // precompiled contracts
 | 
							vm.NewEVM,
 | 
				
			||||||
		geth.NewEVM,
 | 
					 | 
				
			||||||
		options.EVMTrace,
 | 
							options.EVMTrace,
 | 
				
			||||||
		evmSubspace,
 | 
							evmSubspace,
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
 | 
				
			|||||||
@ -23,6 +23,7 @@ import (
 | 
				
			|||||||
	"github.com/spf13/cast"
 | 
						"github.com/spf13/cast"
 | 
				
			||||||
	"github.com/spf13/cobra"
 | 
						"github.com/spf13/cobra"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/Kava-Labs/opendb"
 | 
				
			||||||
	"github.com/kava-labs/kava/app"
 | 
						"github.com/kava-labs/kava/app"
 | 
				
			||||||
	"github.com/kava-labs/kava/app/params"
 | 
						"github.com/kava-labs/kava/app/params"
 | 
				
			||||||
	metricstypes "github.com/kava-labs/kava/x/metrics/types"
 | 
						metricstypes "github.com/kava-labs/kava/x/metrics/types"
 | 
				
			||||||
@ -64,7 +65,7 @@ func (ac appCreator) newApp(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	homeDir := cast.ToString(appOpts.Get(flags.FlagHome))
 | 
						homeDir := cast.ToString(appOpts.Get(flags.FlagHome))
 | 
				
			||||||
	snapshotDir := filepath.Join(homeDir, "data", "snapshots") // TODO can these directory names be imported from somewhere?
 | 
						snapshotDir := filepath.Join(homeDir, "data", "snapshots") // TODO can these directory names be imported from somewhere?
 | 
				
			||||||
	snapshotDB, err := cometbftdb.NewDB("metadata", server.GetAppDBBackend(appOpts), snapshotDir)
 | 
						snapshotDB, err := opendb.OpenDB(appOpts, snapshotDir, "metadata", server.GetAppDBBackend(appOpts))
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		panic(err)
 | 
							panic(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
@ -14,14 +14,14 @@ import (
 | 
				
			|||||||
	"syscall"
 | 
						"syscall"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/cometbft/cometbft/libs/log"
 | 
				
			||||||
	"github.com/cosmos/cosmos-sdk/client"
 | 
						"github.com/cosmos/cosmos-sdk/client"
 | 
				
			||||||
	"github.com/cosmos/cosmos-sdk/server"
 | 
						"github.com/cosmos/cosmos-sdk/server"
 | 
				
			||||||
	"github.com/kava-labs/kava/cmd/kava/opendb"
 | 
					 | 
				
			||||||
	"github.com/linxGnu/grocksdb"
 | 
						"github.com/linxGnu/grocksdb"
 | 
				
			||||||
	"github.com/spf13/cobra"
 | 
						"github.com/spf13/cobra"
 | 
				
			||||||
	"golang.org/x/exp/slices"
 | 
						"golang.org/x/exp/slices"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/cometbft/cometbft/libs/log"
 | 
						"github.com/Kava-Labs/opendb"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
 | 
				
			|||||||
@ -3,15 +3,17 @@ package cmd
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
 | 
						"path/filepath"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						dbm "github.com/cometbft/cometbft-db"
 | 
				
			||||||
 | 
						tmcfg "github.com/cometbft/cometbft/config"
 | 
				
			||||||
 | 
						tmcli "github.com/cometbft/cometbft/libs/cli"
 | 
				
			||||||
	"github.com/cosmos/cosmos-sdk/client"
 | 
						"github.com/cosmos/cosmos-sdk/client"
 | 
				
			||||||
	"github.com/cosmos/cosmos-sdk/client/config"
 | 
						"github.com/cosmos/cosmos-sdk/client/config"
 | 
				
			||||||
	"github.com/cosmos/cosmos-sdk/client/debug"
 | 
						"github.com/cosmos/cosmos-sdk/client/debug"
 | 
				
			||||||
	"github.com/cosmos/cosmos-sdk/client/flags"
 | 
						"github.com/cosmos/cosmos-sdk/client/flags"
 | 
				
			||||||
	"github.com/cosmos/cosmos-sdk/server"
 | 
						"github.com/cosmos/cosmos-sdk/server"
 | 
				
			||||||
 | 
						servertypes "github.com/cosmos/cosmos-sdk/server/types"
 | 
				
			||||||
	tmcfg "github.com/cometbft/cometbft/config"
 | 
					 | 
				
			||||||
	tmcli "github.com/cometbft/cometbft/libs/cli"
 | 
					 | 
				
			||||||
	"github.com/cosmos/cosmos-sdk/x/auth/types"
 | 
						"github.com/cosmos/cosmos-sdk/x/auth/types"
 | 
				
			||||||
	banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
 | 
						banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
 | 
				
			||||||
	"github.com/cosmos/cosmos-sdk/x/genutil"
 | 
						"github.com/cosmos/cosmos-sdk/x/genutil"
 | 
				
			||||||
@ -23,11 +25,11 @@ import (
 | 
				
			|||||||
	servercfg "github.com/evmos/ethermint/server/config"
 | 
						servercfg "github.com/evmos/ethermint/server/config"
 | 
				
			||||||
	"github.com/spf13/cobra"
 | 
						"github.com/spf13/cobra"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/Kava-Labs/opendb"
 | 
				
			||||||
	"github.com/kava-labs/kava/app"
 | 
						"github.com/kava-labs/kava/app"
 | 
				
			||||||
	"github.com/kava-labs/kava/app/params"
 | 
						"github.com/kava-labs/kava/app/params"
 | 
				
			||||||
	"github.com/kava-labs/kava/cmd/kava/cmd/iavlviewer"
 | 
						"github.com/kava-labs/kava/cmd/kava/cmd/iavlviewer"
 | 
				
			||||||
	"github.com/kava-labs/kava/cmd/kava/cmd/rocksdb"
 | 
						"github.com/kava-labs/kava/cmd/kava/cmd/rocksdb"
 | 
				
			||||||
	"github.com/kava-labs/kava/cmd/kava/opendb"
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// EnvPrefix is the prefix environment variables must have to configure the app.
 | 
					// EnvPrefix is the prefix environment variables must have to configure the app.
 | 
				
			||||||
@ -88,6 +90,13 @@ func NewRootCmd() *cobra.Command {
 | 
				
			|||||||
	return rootCmd
 | 
						return rootCmd
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// dbOpener is a function to open `application.db`, potentially with customized options.
 | 
				
			||||||
 | 
					// dbOpener sets dataDir to "data", dbName to "application" and calls generic OpenDB function.
 | 
				
			||||||
 | 
					func dbOpener(opts servertypes.AppOptions, rootDir string, backend dbm.BackendType) (dbm.DB, error) {
 | 
				
			||||||
 | 
						dataDir := filepath.Join(rootDir, "data")
 | 
				
			||||||
 | 
						return opendb.OpenDB(opts, dataDir, "application", backend)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// addSubCmds registers all the sub commands used by kava.
 | 
					// addSubCmds registers all the sub commands used by kava.
 | 
				
			||||||
func addSubCmds(rootCmd *cobra.Command, encodingConfig params.EncodingConfig, defaultNodeHome string) {
 | 
					func addSubCmds(rootCmd *cobra.Command, encodingConfig params.EncodingConfig, defaultNodeHome string) {
 | 
				
			||||||
	gentxModule, ok := app.ModuleBasics[genutiltypes.ModuleName].(genutil.AppModuleBasic)
 | 
						gentxModule, ok := app.ModuleBasics[genutiltypes.ModuleName].(genutil.AppModuleBasic)
 | 
				
			||||||
@ -118,7 +127,7 @@ func addSubCmds(rootCmd *cobra.Command, encodingConfig params.EncodingConfig, de
 | 
				
			|||||||
	opts := ethermintserver.StartOptions{
 | 
						opts := ethermintserver.StartOptions{
 | 
				
			||||||
		AppCreator:      ac.newApp,
 | 
							AppCreator:      ac.newApp,
 | 
				
			||||||
		DefaultNodeHome: app.DefaultNodeHome,
 | 
							DefaultNodeHome: app.DefaultNodeHome,
 | 
				
			||||||
		DBOpener:        opendb.OpenDB,
 | 
							DBOpener:        dbOpener,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// ethermintserver adds additional flags to start the JSON-RPC server for evm support
 | 
						// ethermintserver adds additional flags to start the JSON-RPC server for evm support
 | 
				
			||||||
	ethermintserver.AddCommands(
 | 
						ethermintserver.AddCommands(
 | 
				
			||||||
 | 
				
			|||||||
@ -1,499 +0,0 @@
 | 
				
			|||||||
//go:build rocksdb
 | 
					 | 
				
			||||||
// +build rocksdb
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package opendb
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"github.com/go-kit/kit/metrics"
 | 
					 | 
				
			||||||
	"github.com/go-kit/kit/metrics/prometheus"
 | 
					 | 
				
			||||||
	stdprometheus "github.com/prometheus/client_golang/prometheus"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// rocksdbMetrics will be initialized in registerMetrics() if enableRocksdbMetrics flag set to true
 | 
					 | 
				
			||||||
var rocksdbMetrics *Metrics
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Metrics contains all rocksdb metrics which will be reported to prometheus
 | 
					 | 
				
			||||||
type Metrics struct {
 | 
					 | 
				
			||||||
	// Keys
 | 
					 | 
				
			||||||
	NumberKeysWritten metrics.Gauge
 | 
					 | 
				
			||||||
	NumberKeysRead    metrics.Gauge
 | 
					 | 
				
			||||||
	NumberKeysUpdated metrics.Gauge
 | 
					 | 
				
			||||||
	EstimateNumKeys   metrics.Gauge
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Files
 | 
					 | 
				
			||||||
	NumberFileOpens  metrics.Gauge
 | 
					 | 
				
			||||||
	NumberFileErrors metrics.Gauge
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Memory
 | 
					 | 
				
			||||||
	BlockCacheUsage         metrics.Gauge
 | 
					 | 
				
			||||||
	EstimateTableReadersMem metrics.Gauge
 | 
					 | 
				
			||||||
	CurSizeAllMemTables     metrics.Gauge
 | 
					 | 
				
			||||||
	BlockCachePinnedUsage   metrics.Gauge
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Cache
 | 
					 | 
				
			||||||
	BlockCacheMiss        metrics.Gauge
 | 
					 | 
				
			||||||
	BlockCacheHit         metrics.Gauge
 | 
					 | 
				
			||||||
	BlockCacheAdd         metrics.Gauge
 | 
					 | 
				
			||||||
	BlockCacheAddFailures metrics.Gauge
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Detailed Cache
 | 
					 | 
				
			||||||
	BlockCacheIndexMiss        metrics.Gauge
 | 
					 | 
				
			||||||
	BlockCacheIndexHit         metrics.Gauge
 | 
					 | 
				
			||||||
	BlockCacheIndexBytesInsert metrics.Gauge
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	BlockCacheFilterMiss        metrics.Gauge
 | 
					 | 
				
			||||||
	BlockCacheFilterHit         metrics.Gauge
 | 
					 | 
				
			||||||
	BlockCacheFilterBytesInsert metrics.Gauge
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	BlockCacheDataMiss        metrics.Gauge
 | 
					 | 
				
			||||||
	BlockCacheDataHit         metrics.Gauge
 | 
					 | 
				
			||||||
	BlockCacheDataBytesInsert metrics.Gauge
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Latency
 | 
					 | 
				
			||||||
	DBGetMicrosP50   metrics.Gauge
 | 
					 | 
				
			||||||
	DBGetMicrosP95   metrics.Gauge
 | 
					 | 
				
			||||||
	DBGetMicrosP99   metrics.Gauge
 | 
					 | 
				
			||||||
	DBGetMicrosP100  metrics.Gauge
 | 
					 | 
				
			||||||
	DBGetMicrosCount metrics.Gauge
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	DBWriteMicrosP50   metrics.Gauge
 | 
					 | 
				
			||||||
	DBWriteMicrosP95   metrics.Gauge
 | 
					 | 
				
			||||||
	DBWriteMicrosP99   metrics.Gauge
 | 
					 | 
				
			||||||
	DBWriteMicrosP100  metrics.Gauge
 | 
					 | 
				
			||||||
	DBWriteMicrosCount metrics.Gauge
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Write Stall
 | 
					 | 
				
			||||||
	StallMicros metrics.Gauge
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	DBWriteStallP50   metrics.Gauge
 | 
					 | 
				
			||||||
	DBWriteStallP95   metrics.Gauge
 | 
					 | 
				
			||||||
	DBWriteStallP99   metrics.Gauge
 | 
					 | 
				
			||||||
	DBWriteStallP100  metrics.Gauge
 | 
					 | 
				
			||||||
	DBWriteStallCount metrics.Gauge
 | 
					 | 
				
			||||||
	DBWriteStallSum   metrics.Gauge
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Bloom Filter
 | 
					 | 
				
			||||||
	BloomFilterUseful           metrics.Gauge
 | 
					 | 
				
			||||||
	BloomFilterFullPositive     metrics.Gauge
 | 
					 | 
				
			||||||
	BloomFilterFullTruePositive metrics.Gauge
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// LSM Tree Stats
 | 
					 | 
				
			||||||
	LastLevelReadBytes    metrics.Gauge
 | 
					 | 
				
			||||||
	LastLevelReadCount    metrics.Gauge
 | 
					 | 
				
			||||||
	NonLastLevelReadBytes metrics.Gauge
 | 
					 | 
				
			||||||
	NonLastLevelReadCount metrics.Gauge
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	GetHitL0      metrics.Gauge
 | 
					 | 
				
			||||||
	GetHitL1      metrics.Gauge
 | 
					 | 
				
			||||||
	GetHitL2AndUp metrics.Gauge
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// registerMetrics registers metrics in prometheus and initializes rocksdbMetrics variable
 | 
					 | 
				
			||||||
func registerMetrics() {
 | 
					 | 
				
			||||||
	if rocksdbMetrics != nil {
 | 
					 | 
				
			||||||
		// metrics already registered
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	labels := make([]string, 0)
 | 
					 | 
				
			||||||
	rocksdbMetrics = &Metrics{
 | 
					 | 
				
			||||||
		// Keys
 | 
					 | 
				
			||||||
		NumberKeysWritten: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "key",
 | 
					 | 
				
			||||||
			Name:      "number_keys_written",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		NumberKeysRead: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "key",
 | 
					 | 
				
			||||||
			Name:      "number_keys_read",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		NumberKeysUpdated: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "key",
 | 
					 | 
				
			||||||
			Name:      "number_keys_updated",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		EstimateNumKeys: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "key",
 | 
					 | 
				
			||||||
			Name:      "estimate_num_keys",
 | 
					 | 
				
			||||||
			Help:      "estimated number of total keys in the active and unflushed immutable memtables and storage",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Files
 | 
					 | 
				
			||||||
		NumberFileOpens: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "file",
 | 
					 | 
				
			||||||
			Name:      "number_file_opens",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		NumberFileErrors: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "file",
 | 
					 | 
				
			||||||
			Name:      "number_file_errors",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Memory
 | 
					 | 
				
			||||||
		BlockCacheUsage: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "memory",
 | 
					 | 
				
			||||||
			Name:      "block_cache_usage",
 | 
					 | 
				
			||||||
			Help:      "memory size for the entries residing in block cache",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		EstimateTableReadersMem: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "memory",
 | 
					 | 
				
			||||||
			Name:      "estimate_table_readers_mem",
 | 
					 | 
				
			||||||
			Help:      "estimated memory used for reading SST tables, excluding memory used in block cache (e.g., filter and index blocks)",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		CurSizeAllMemTables: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "memory",
 | 
					 | 
				
			||||||
			Name:      "cur_size_all_mem_tables",
 | 
					 | 
				
			||||||
			Help:      "approximate size of active and unflushed immutable memtables (bytes)",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		BlockCachePinnedUsage: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "memory",
 | 
					 | 
				
			||||||
			Name:      "block_cache_pinned_usage",
 | 
					 | 
				
			||||||
			Help:      "returns the memory size for the entries being pinned",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Cache
 | 
					 | 
				
			||||||
		BlockCacheMiss: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "cache",
 | 
					 | 
				
			||||||
			Name:      "block_cache_miss",
 | 
					 | 
				
			||||||
			Help:      "block_cache_miss == block_cache_index_miss + block_cache_filter_miss + block_cache_data_miss",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		BlockCacheHit: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "cache",
 | 
					 | 
				
			||||||
			Name:      "block_cache_hit",
 | 
					 | 
				
			||||||
			Help:      "block_cache_hit == block_cache_index_hit + block_cache_filter_hit + block_cache_data_hit",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		BlockCacheAdd: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "cache",
 | 
					 | 
				
			||||||
			Name:      "block_cache_add",
 | 
					 | 
				
			||||||
			Help:      "number of blocks added to block cache",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		BlockCacheAddFailures: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "cache",
 | 
					 | 
				
			||||||
			Name:      "block_cache_add_failures",
 | 
					 | 
				
			||||||
			Help:      "number of failures when adding blocks to block cache",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Detailed Cache
 | 
					 | 
				
			||||||
		BlockCacheIndexMiss: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "detailed_cache",
 | 
					 | 
				
			||||||
			Name:      "block_cache_index_miss",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		BlockCacheIndexHit: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "detailed_cache",
 | 
					 | 
				
			||||||
			Name:      "block_cache_index_hit",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		BlockCacheIndexBytesInsert: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "detailed_cache",
 | 
					 | 
				
			||||||
			Name:      "block_cache_index_bytes_insert",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		BlockCacheFilterMiss: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "detailed_cache",
 | 
					 | 
				
			||||||
			Name:      "block_cache_filter_miss",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		BlockCacheFilterHit: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "detailed_cache",
 | 
					 | 
				
			||||||
			Name:      "block_cache_filter_hit",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		BlockCacheFilterBytesInsert: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "detailed_cache",
 | 
					 | 
				
			||||||
			Name:      "block_cache_filter_bytes_insert",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		BlockCacheDataMiss: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "detailed_cache",
 | 
					 | 
				
			||||||
			Name:      "block_cache_data_miss",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		BlockCacheDataHit: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "detailed_cache",
 | 
					 | 
				
			||||||
			Name:      "block_cache_data_hit",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		BlockCacheDataBytesInsert: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "detailed_cache",
 | 
					 | 
				
			||||||
			Name:      "block_cache_data_bytes_insert",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Latency
 | 
					 | 
				
			||||||
		DBGetMicrosP50: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "latency",
 | 
					 | 
				
			||||||
			Name:      "db_get_micros_p50",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		DBGetMicrosP95: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "latency",
 | 
					 | 
				
			||||||
			Name:      "db_get_micros_p95",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		DBGetMicrosP99: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "latency",
 | 
					 | 
				
			||||||
			Name:      "db_get_micros_p99",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		DBGetMicrosP100: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "latency",
 | 
					 | 
				
			||||||
			Name:      "db_get_micros_p100",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		DBGetMicrosCount: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "latency",
 | 
					 | 
				
			||||||
			Name:      "db_get_micros_count",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		DBWriteMicrosP50: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "latency",
 | 
					 | 
				
			||||||
			Name:      "db_write_micros_p50",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		DBWriteMicrosP95: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "latency",
 | 
					 | 
				
			||||||
			Name:      "db_write_micros_p95",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		DBWriteMicrosP99: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "latency",
 | 
					 | 
				
			||||||
			Name:      "db_write_micros_p99",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		DBWriteMicrosP100: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "latency",
 | 
					 | 
				
			||||||
			Name:      "db_write_micros_p100",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		DBWriteMicrosCount: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "latency",
 | 
					 | 
				
			||||||
			Name:      "db_write_micros_count",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Write Stall
 | 
					 | 
				
			||||||
		StallMicros: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "stall",
 | 
					 | 
				
			||||||
			Name:      "stall_micros",
 | 
					 | 
				
			||||||
			Help:      "Writer has to wait for compaction or flush to finish.",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		DBWriteStallP50: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "stall",
 | 
					 | 
				
			||||||
			Name:      "db_write_stall_p50",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		DBWriteStallP95: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "stall",
 | 
					 | 
				
			||||||
			Name:      "db_write_stall_p95",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		DBWriteStallP99: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "stall",
 | 
					 | 
				
			||||||
			Name:      "db_write_stall_p99",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		DBWriteStallP100: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "stall",
 | 
					 | 
				
			||||||
			Name:      "db_write_stall_p100",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		DBWriteStallCount: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "stall",
 | 
					 | 
				
			||||||
			Name:      "db_write_stall_count",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		DBWriteStallSum: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "stall",
 | 
					 | 
				
			||||||
			Name:      "db_write_stall_sum",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Bloom Filter
 | 
					 | 
				
			||||||
		BloomFilterUseful: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "filter",
 | 
					 | 
				
			||||||
			Name:      "bloom_filter_useful",
 | 
					 | 
				
			||||||
			Help:      "number of times bloom filter has avoided file reads, i.e., negatives.",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		BloomFilterFullPositive: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "filter",
 | 
					 | 
				
			||||||
			Name:      "bloom_filter_full_positive",
 | 
					 | 
				
			||||||
			Help:      "number of times bloom FullFilter has not avoided the reads.",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		BloomFilterFullTruePositive: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "filter",
 | 
					 | 
				
			||||||
			Name:      "bloom_filter_full_true_positive",
 | 
					 | 
				
			||||||
			Help:      "number of times bloom FullFilter has not avoided the reads and data actually exist.",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// LSM Tree Stats
 | 
					 | 
				
			||||||
		LastLevelReadBytes: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "lsm",
 | 
					 | 
				
			||||||
			Name:      "last_level_read_bytes",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		LastLevelReadCount: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "lsm",
 | 
					 | 
				
			||||||
			Name:      "last_level_read_count",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		NonLastLevelReadBytes: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "lsm",
 | 
					 | 
				
			||||||
			Name:      "non_last_level_read_bytes",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		NonLastLevelReadCount: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "lsm",
 | 
					 | 
				
			||||||
			Name:      "non_last_level_read_count",
 | 
					 | 
				
			||||||
			Help:      "",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		GetHitL0: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "lsm",
 | 
					 | 
				
			||||||
			Name:      "get_hit_l0",
 | 
					 | 
				
			||||||
			Help:      "number of Get() queries served by L0",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		GetHitL1: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "lsm",
 | 
					 | 
				
			||||||
			Name:      "get_hit_l1",
 | 
					 | 
				
			||||||
			Help:      "number of Get() queries served by L1",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
		GetHitL2AndUp: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
 | 
					 | 
				
			||||||
			Namespace: "rocksdb",
 | 
					 | 
				
			||||||
			Subsystem: "lsm",
 | 
					 | 
				
			||||||
			Name:      "get_hit_l2_and_up",
 | 
					 | 
				
			||||||
			Help:      "number of Get() queries served by L2 and up",
 | 
					 | 
				
			||||||
		}, labels),
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// report reports metrics to prometheus based on rocksdb props and stats
 | 
					 | 
				
			||||||
func (m *Metrics) report(props *properties, stats *stats) {
 | 
					 | 
				
			||||||
	// Keys
 | 
					 | 
				
			||||||
	m.NumberKeysWritten.Set(float64(stats.NumberKeysWritten))
 | 
					 | 
				
			||||||
	m.NumberKeysRead.Set(float64(stats.NumberKeysRead))
 | 
					 | 
				
			||||||
	m.NumberKeysUpdated.Set(float64(stats.NumberKeysUpdated))
 | 
					 | 
				
			||||||
	m.EstimateNumKeys.Set(float64(props.EstimateNumKeys))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Files
 | 
					 | 
				
			||||||
	m.NumberFileOpens.Set(float64(stats.NumberFileOpens))
 | 
					 | 
				
			||||||
	m.NumberFileErrors.Set(float64(stats.NumberFileErrors))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Memory
 | 
					 | 
				
			||||||
	m.BlockCacheUsage.Set(float64(props.BlockCacheUsage))
 | 
					 | 
				
			||||||
	m.EstimateTableReadersMem.Set(float64(props.EstimateTableReadersMem))
 | 
					 | 
				
			||||||
	m.CurSizeAllMemTables.Set(float64(props.CurSizeAllMemTables))
 | 
					 | 
				
			||||||
	m.BlockCachePinnedUsage.Set(float64(props.BlockCachePinnedUsage))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Cache
 | 
					 | 
				
			||||||
	m.BlockCacheMiss.Set(float64(stats.BlockCacheMiss))
 | 
					 | 
				
			||||||
	m.BlockCacheHit.Set(float64(stats.BlockCacheHit))
 | 
					 | 
				
			||||||
	m.BlockCacheAdd.Set(float64(stats.BlockCacheAdd))
 | 
					 | 
				
			||||||
	m.BlockCacheAddFailures.Set(float64(stats.BlockCacheAddFailures))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Detailed Cache
 | 
					 | 
				
			||||||
	m.BlockCacheIndexMiss.Set(float64(stats.BlockCacheIndexMiss))
 | 
					 | 
				
			||||||
	m.BlockCacheIndexHit.Set(float64(stats.BlockCacheIndexHit))
 | 
					 | 
				
			||||||
	m.BlockCacheIndexBytesInsert.Set(float64(stats.BlockCacheIndexBytesInsert))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	m.BlockCacheFilterMiss.Set(float64(stats.BlockCacheFilterMiss))
 | 
					 | 
				
			||||||
	m.BlockCacheFilterHit.Set(float64(stats.BlockCacheFilterHit))
 | 
					 | 
				
			||||||
	m.BlockCacheFilterBytesInsert.Set(float64(stats.BlockCacheFilterBytesInsert))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	m.BlockCacheDataMiss.Set(float64(stats.BlockCacheDataMiss))
 | 
					 | 
				
			||||||
	m.BlockCacheDataHit.Set(float64(stats.BlockCacheDataHit))
 | 
					 | 
				
			||||||
	m.BlockCacheDataBytesInsert.Set(float64(stats.BlockCacheDataBytesInsert))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Latency
 | 
					 | 
				
			||||||
	m.DBGetMicrosP50.Set(stats.DBGetMicros.P50)
 | 
					 | 
				
			||||||
	m.DBGetMicrosP95.Set(stats.DBGetMicros.P95)
 | 
					 | 
				
			||||||
	m.DBGetMicrosP99.Set(stats.DBGetMicros.P99)
 | 
					 | 
				
			||||||
	m.DBGetMicrosP100.Set(stats.DBGetMicros.P100)
 | 
					 | 
				
			||||||
	m.DBGetMicrosCount.Set(stats.DBGetMicros.Count)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	m.DBWriteMicrosP50.Set(stats.DBWriteMicros.P50)
 | 
					 | 
				
			||||||
	m.DBWriteMicrosP95.Set(stats.DBWriteMicros.P95)
 | 
					 | 
				
			||||||
	m.DBWriteMicrosP99.Set(stats.DBWriteMicros.P99)
 | 
					 | 
				
			||||||
	m.DBWriteMicrosP100.Set(stats.DBWriteMicros.P100)
 | 
					 | 
				
			||||||
	m.DBWriteMicrosCount.Set(stats.DBWriteMicros.Count)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Write Stall
 | 
					 | 
				
			||||||
	m.StallMicros.Set(float64(stats.StallMicros))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	m.DBWriteStallP50.Set(stats.DBWriteStallHistogram.P50)
 | 
					 | 
				
			||||||
	m.DBWriteStallP95.Set(stats.DBWriteStallHistogram.P95)
 | 
					 | 
				
			||||||
	m.DBWriteStallP99.Set(stats.DBWriteStallHistogram.P99)
 | 
					 | 
				
			||||||
	m.DBWriteStallP100.Set(stats.DBWriteStallHistogram.P100)
 | 
					 | 
				
			||||||
	m.DBWriteStallCount.Set(stats.DBWriteStallHistogram.Count)
 | 
					 | 
				
			||||||
	m.DBWriteStallSum.Set(stats.DBWriteStallHistogram.Sum)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Bloom Filter
 | 
					 | 
				
			||||||
	m.BloomFilterUseful.Set(float64(stats.BloomFilterUseful))
 | 
					 | 
				
			||||||
	m.BloomFilterFullPositive.Set(float64(stats.BloomFilterFullPositive))
 | 
					 | 
				
			||||||
	m.BloomFilterFullTruePositive.Set(float64(stats.BloomFilterFullTruePositive))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// LSM Tree Stats
 | 
					 | 
				
			||||||
	m.LastLevelReadBytes.Set(float64(stats.LastLevelReadBytes))
 | 
					 | 
				
			||||||
	m.LastLevelReadCount.Set(float64(stats.LastLevelReadCount))
 | 
					 | 
				
			||||||
	m.NonLastLevelReadBytes.Set(float64(stats.NonLastLevelReadBytes))
 | 
					 | 
				
			||||||
	m.NonLastLevelReadCount.Set(float64(stats.NonLastLevelReadCount))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	m.GetHitL0.Set(float64(stats.GetHitL0))
 | 
					 | 
				
			||||||
	m.GetHitL1.Set(float64(stats.GetHitL1))
 | 
					 | 
				
			||||||
	m.GetHitL2AndUp.Set(float64(stats.GetHitL2AndUp))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,18 +0,0 @@
 | 
				
			|||||||
//go:build !rocksdb
 | 
					 | 
				
			||||||
// +build !rocksdb
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package opendb
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"path/filepath"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	dbm "github.com/cometbft/cometbft-db"
 | 
					 | 
				
			||||||
	"github.com/cosmos/cosmos-sdk/server/types"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// OpenDB is a copy of default DBOpener function used by ethermint, see for details:
 | 
					 | 
				
			||||||
// https://github.com/evmos/ethermint/blob/07cf2bd2b1ce9bdb2e44ec42a39e7239292a14af/server/start.go#L647
 | 
					 | 
				
			||||||
func OpenDB(_ types.AppOptions, home string, backendType dbm.BackendType) (dbm.DB, error) {
 | 
					 | 
				
			||||||
	dataDir := filepath.Join(home, "data")
 | 
					 | 
				
			||||||
	return dbm.NewDB("application", backendType, dataDir)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,398 +0,0 @@
 | 
				
			|||||||
//go:build rocksdb
 | 
					 | 
				
			||||||
// +build rocksdb
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Copyright 2023 Kava Labs, Inc.
 | 
					 | 
				
			||||||
// Copyright 2023 Cronos Labs, Inc.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Derived from https://github.com/crypto-org-chain/cronos@496ce7e
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
					 | 
				
			||||||
// you may not use this file except in compliance with the License.
 | 
					 | 
				
			||||||
// You may obtain a copy of the License at
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//      http://www.apache.org/licenses/LICENSE-2.0
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Unless required by applicable law or agreed to in writing, software
 | 
					 | 
				
			||||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
					 | 
				
			||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
					 | 
				
			||||||
// See the License for the specific language governing permissions and
 | 
					 | 
				
			||||||
// limitations under the License.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package opendb
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"errors"
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"os"
 | 
					 | 
				
			||||||
	"path/filepath"
 | 
					 | 
				
			||||||
	"runtime"
 | 
					 | 
				
			||||||
	"strings"
 | 
					 | 
				
			||||||
	"time"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	dbm "github.com/cometbft/cometbft-db"
 | 
					 | 
				
			||||||
	"github.com/cosmos/cosmos-sdk/server/types"
 | 
					 | 
				
			||||||
	"github.com/linxGnu/grocksdb"
 | 
					 | 
				
			||||||
	"github.com/spf13/cast"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var ErrUnexpectedConfiguration = errors.New("unexpected rocksdb configuration, rocksdb should have only one column family named default")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const (
 | 
					 | 
				
			||||||
	// default tm-db block cache size for RocksDB
 | 
					 | 
				
			||||||
	defaultBlockCacheSize = 1 << 30
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	DefaultColumnFamilyName = "default"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	enableMetricsOptName             = "rocksdb.enable-metrics"
 | 
					 | 
				
			||||||
	reportMetricsIntervalSecsOptName = "rocksdb.report-metrics-interval-secs"
 | 
					 | 
				
			||||||
	defaultReportMetricsIntervalSecs = 15
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	maxOpenFilesDBOptName           = "rocksdb.max-open-files"
 | 
					 | 
				
			||||||
	maxFileOpeningThreadsDBOptName  = "rocksdb.max-file-opening-threads"
 | 
					 | 
				
			||||||
	tableCacheNumshardbitsDBOptName = "rocksdb.table_cache_numshardbits"
 | 
					 | 
				
			||||||
	allowMMAPWritesDBOptName        = "rocksdb.allow_mmap_writes"
 | 
					 | 
				
			||||||
	allowMMAPReadsDBOptName         = "rocksdb.allow_mmap_reads"
 | 
					 | 
				
			||||||
	useFsyncDBOptName               = "rocksdb.use_fsync"
 | 
					 | 
				
			||||||
	useAdaptiveMutexDBOptName       = "rocksdb.use_adaptive_mutex"
 | 
					 | 
				
			||||||
	bytesPerSyncDBOptName           = "rocksdb.bytes_per_sync"
 | 
					 | 
				
			||||||
	maxBackgroundJobsDBOptName      = "rocksdb.max-background-jobs"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	writeBufferSizeCFOptName                = "rocksdb.write-buffer-size"
 | 
					 | 
				
			||||||
	numLevelsCFOptName                      = "rocksdb.num-levels"
 | 
					 | 
				
			||||||
	maxWriteBufferNumberCFOptName           = "rocksdb.max_write_buffer_number"
 | 
					 | 
				
			||||||
	minWriteBufferNumberToMergeCFOptName    = "rocksdb.min_write_buffer_number_to_merge"
 | 
					 | 
				
			||||||
	maxBytesForLevelBaseCFOptName           = "rocksdb.max_bytes_for_level_base"
 | 
					 | 
				
			||||||
	maxBytesForLevelMultiplierCFOptName     = "rocksdb.max_bytes_for_level_multiplier"
 | 
					 | 
				
			||||||
	targetFileSizeBaseCFOptName             = "rocksdb.target_file_size_base"
 | 
					 | 
				
			||||||
	targetFileSizeMultiplierCFOptName       = "rocksdb.target_file_size_multiplier"
 | 
					 | 
				
			||||||
	level0FileNumCompactionTriggerCFOptName = "rocksdb.level0_file_num_compaction_trigger"
 | 
					 | 
				
			||||||
	level0SlowdownWritesTriggerCFOptName    = "rocksdb.level0_slowdown_writes_trigger"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	blockCacheSizeBBTOOptName                   = "rocksdb.block_cache_size"
 | 
					 | 
				
			||||||
	bitsPerKeyBBTOOptName                       = "rocksdb.bits_per_key"
 | 
					 | 
				
			||||||
	blockSizeBBTOOptName                        = "rocksdb.block_size"
 | 
					 | 
				
			||||||
	cacheIndexAndFilterBlocksBBTOOptName        = "rocksdb.cache_index_and_filter_blocks"
 | 
					 | 
				
			||||||
	pinL0FilterAndIndexBlocksInCacheBBTOOptName = "rocksdb.pin_l0_filter_and_index_blocks_in_cache"
 | 
					 | 
				
			||||||
	formatVersionBBTOOptName                    = "rocksdb.format_version"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	asyncIOReadOptName = "rocksdb.read-async-io"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func OpenDB(appOpts types.AppOptions, home string, backendType dbm.BackendType) (dbm.DB, error) {
 | 
					 | 
				
			||||||
	dataDir := filepath.Join(home, "data")
 | 
					 | 
				
			||||||
	if backendType == dbm.RocksDBBackend {
 | 
					 | 
				
			||||||
		return openRocksdb(dataDir, appOpts)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return dbm.NewDB("application", backendType, dataDir)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// openRocksdb loads existing options, overrides some of them with appOpts and opens database
 | 
					 | 
				
			||||||
// option will be overridden only in case if it explicitly specified in appOpts
 | 
					 | 
				
			||||||
func openRocksdb(dir string, appOpts types.AppOptions) (dbm.DB, error) {
 | 
					 | 
				
			||||||
	optionsPath := filepath.Join(dir, "application.db")
 | 
					 | 
				
			||||||
	dbOpts, cfOpts, err := LoadLatestOptions(optionsPath)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	// customize rocksdb options
 | 
					 | 
				
			||||||
	bbtoOpts := bbtoFromAppOpts(appOpts)
 | 
					 | 
				
			||||||
	dbOpts.SetBlockBasedTableFactory(bbtoOpts)
 | 
					 | 
				
			||||||
	cfOpts.SetBlockBasedTableFactory(bbtoOpts)
 | 
					 | 
				
			||||||
	dbOpts = overrideDBOpts(dbOpts, appOpts)
 | 
					 | 
				
			||||||
	cfOpts = overrideCFOpts(cfOpts, appOpts)
 | 
					 | 
				
			||||||
	readOpts := readOptsFromAppOpts(appOpts)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	enableMetrics := cast.ToBool(appOpts.Get(enableMetricsOptName))
 | 
					 | 
				
			||||||
	reportMetricsIntervalSecs := cast.ToInt64(appOpts.Get(reportMetricsIntervalSecsOptName))
 | 
					 | 
				
			||||||
	if reportMetricsIntervalSecs == 0 {
 | 
					 | 
				
			||||||
		reportMetricsIntervalSecs = defaultReportMetricsIntervalSecs
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return newRocksDBWithOptions("application", dir, dbOpts, cfOpts, readOpts, enableMetrics, reportMetricsIntervalSecs)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// LoadLatestOptions loads and returns database and column family options
 | 
					 | 
				
			||||||
// if options file not found, it means database isn't created yet, in such case default tm-db options will be returned
 | 
					 | 
				
			||||||
// if database exists it should have only one column family named default
 | 
					 | 
				
			||||||
func LoadLatestOptions(dir string) (*grocksdb.Options, *grocksdb.Options, error) {
 | 
					 | 
				
			||||||
	latestOpts, err := grocksdb.LoadLatestOptions(dir, grocksdb.NewDefaultEnv(), true, grocksdb.NewLRUCache(defaultBlockCacheSize))
 | 
					 | 
				
			||||||
	if err != nil && strings.HasPrefix(err.Error(), "NotFound: ") {
 | 
					 | 
				
			||||||
		return newDefaultOptions(), newDefaultOptions(), nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	cfNames := latestOpts.ColumnFamilyNames()
 | 
					 | 
				
			||||||
	cfOpts := latestOpts.ColumnFamilyOpts()
 | 
					 | 
				
			||||||
	// db should have only one column family named default
 | 
					 | 
				
			||||||
	ok := len(cfNames) == 1 && cfNames[0] == DefaultColumnFamilyName
 | 
					 | 
				
			||||||
	if !ok {
 | 
					 | 
				
			||||||
		return nil, nil, ErrUnexpectedConfiguration
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// return db and cf opts
 | 
					 | 
				
			||||||
	return latestOpts.Options(), &cfOpts[0], nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// overrideDBOpts merges dbOpts and appOpts, appOpts takes precedence
 | 
					 | 
				
			||||||
func overrideDBOpts(dbOpts *grocksdb.Options, appOpts types.AppOptions) *grocksdb.Options {
 | 
					 | 
				
			||||||
	maxOpenFiles := appOpts.Get(maxOpenFilesDBOptName)
 | 
					 | 
				
			||||||
	if maxOpenFiles != nil {
 | 
					 | 
				
			||||||
		dbOpts.SetMaxOpenFiles(cast.ToInt(maxOpenFiles))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	maxFileOpeningThreads := appOpts.Get(maxFileOpeningThreadsDBOptName)
 | 
					 | 
				
			||||||
	if maxFileOpeningThreads != nil {
 | 
					 | 
				
			||||||
		dbOpts.SetMaxFileOpeningThreads(cast.ToInt(maxFileOpeningThreads))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	tableCacheNumshardbits := appOpts.Get(tableCacheNumshardbitsDBOptName)
 | 
					 | 
				
			||||||
	if tableCacheNumshardbits != nil {
 | 
					 | 
				
			||||||
		dbOpts.SetTableCacheNumshardbits(cast.ToInt(tableCacheNumshardbits))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	allowMMAPWrites := appOpts.Get(allowMMAPWritesDBOptName)
 | 
					 | 
				
			||||||
	if allowMMAPWrites != nil {
 | 
					 | 
				
			||||||
		dbOpts.SetAllowMmapWrites(cast.ToBool(allowMMAPWrites))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	allowMMAPReads := appOpts.Get(allowMMAPReadsDBOptName)
 | 
					 | 
				
			||||||
	if allowMMAPReads != nil {
 | 
					 | 
				
			||||||
		dbOpts.SetAllowMmapReads(cast.ToBool(allowMMAPReads))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	useFsync := appOpts.Get(useFsyncDBOptName)
 | 
					 | 
				
			||||||
	if useFsync != nil {
 | 
					 | 
				
			||||||
		dbOpts.SetUseFsync(cast.ToBool(useFsync))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	useAdaptiveMutex := appOpts.Get(useAdaptiveMutexDBOptName)
 | 
					 | 
				
			||||||
	if useAdaptiveMutex != nil {
 | 
					 | 
				
			||||||
		dbOpts.SetUseAdaptiveMutex(cast.ToBool(useAdaptiveMutex))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	bytesPerSync := appOpts.Get(bytesPerSyncDBOptName)
 | 
					 | 
				
			||||||
	if bytesPerSync != nil {
 | 
					 | 
				
			||||||
		dbOpts.SetBytesPerSync(cast.ToUint64(bytesPerSync))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	maxBackgroundJobs := appOpts.Get(maxBackgroundJobsDBOptName)
 | 
					 | 
				
			||||||
	if maxBackgroundJobs != nil {
 | 
					 | 
				
			||||||
		dbOpts.SetMaxBackgroundJobs(cast.ToInt(maxBackgroundJobs))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return dbOpts
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// overrideCFOpts merges cfOpts and appOpts, appOpts takes precedence
 | 
					 | 
				
			||||||
func overrideCFOpts(cfOpts *grocksdb.Options, appOpts types.AppOptions) *grocksdb.Options {
 | 
					 | 
				
			||||||
	writeBufferSize := appOpts.Get(writeBufferSizeCFOptName)
 | 
					 | 
				
			||||||
	if writeBufferSize != nil {
 | 
					 | 
				
			||||||
		cfOpts.SetWriteBufferSize(cast.ToUint64(writeBufferSize))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	numLevels := appOpts.Get(numLevelsCFOptName)
 | 
					 | 
				
			||||||
	if numLevels != nil {
 | 
					 | 
				
			||||||
		cfOpts.SetNumLevels(cast.ToInt(numLevels))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	maxWriteBufferNumber := appOpts.Get(maxWriteBufferNumberCFOptName)
 | 
					 | 
				
			||||||
	if maxWriteBufferNumber != nil {
 | 
					 | 
				
			||||||
		cfOpts.SetMaxWriteBufferNumber(cast.ToInt(maxWriteBufferNumber))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	minWriteBufferNumberToMerge := appOpts.Get(minWriteBufferNumberToMergeCFOptName)
 | 
					 | 
				
			||||||
	if minWriteBufferNumberToMerge != nil {
 | 
					 | 
				
			||||||
		cfOpts.SetMinWriteBufferNumberToMerge(cast.ToInt(minWriteBufferNumberToMerge))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	maxBytesForLevelBase := appOpts.Get(maxBytesForLevelBaseCFOptName)
 | 
					 | 
				
			||||||
	if maxBytesForLevelBase != nil {
 | 
					 | 
				
			||||||
		cfOpts.SetMaxBytesForLevelBase(cast.ToUint64(maxBytesForLevelBase))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	maxBytesForLevelMultiplier := appOpts.Get(maxBytesForLevelMultiplierCFOptName)
 | 
					 | 
				
			||||||
	if maxBytesForLevelMultiplier != nil {
 | 
					 | 
				
			||||||
		cfOpts.SetMaxBytesForLevelMultiplier(cast.ToFloat64(maxBytesForLevelMultiplier))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	targetFileSizeBase := appOpts.Get(targetFileSizeBaseCFOptName)
 | 
					 | 
				
			||||||
	if targetFileSizeBase != nil {
 | 
					 | 
				
			||||||
		cfOpts.SetTargetFileSizeBase(cast.ToUint64(targetFileSizeBase))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	targetFileSizeMultiplier := appOpts.Get(targetFileSizeMultiplierCFOptName)
 | 
					 | 
				
			||||||
	if targetFileSizeMultiplier != nil {
 | 
					 | 
				
			||||||
		cfOpts.SetTargetFileSizeMultiplier(cast.ToInt(targetFileSizeMultiplier))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	level0FileNumCompactionTrigger := appOpts.Get(level0FileNumCompactionTriggerCFOptName)
 | 
					 | 
				
			||||||
	if level0FileNumCompactionTrigger != nil {
 | 
					 | 
				
			||||||
		cfOpts.SetLevel0FileNumCompactionTrigger(cast.ToInt(level0FileNumCompactionTrigger))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	level0SlowdownWritesTrigger := appOpts.Get(level0SlowdownWritesTriggerCFOptName)
 | 
					 | 
				
			||||||
	if level0SlowdownWritesTrigger != nil {
 | 
					 | 
				
			||||||
		cfOpts.SetLevel0SlowdownWritesTrigger(cast.ToInt(level0SlowdownWritesTrigger))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return cfOpts
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func readOptsFromAppOpts(appOpts types.AppOptions) *grocksdb.ReadOptions {
 | 
					 | 
				
			||||||
	ro := grocksdb.NewDefaultReadOptions()
 | 
					 | 
				
			||||||
	asyncIO := appOpts.Get(asyncIOReadOptName)
 | 
					 | 
				
			||||||
	if asyncIO != nil {
 | 
					 | 
				
			||||||
		ro.SetAsyncIO(cast.ToBool(asyncIO))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return ro
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func bbtoFromAppOpts(appOpts types.AppOptions) *grocksdb.BlockBasedTableOptions {
 | 
					 | 
				
			||||||
	bbto := defaultBBTO()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	blockCacheSize := appOpts.Get(blockCacheSizeBBTOOptName)
 | 
					 | 
				
			||||||
	if blockCacheSize != nil {
 | 
					 | 
				
			||||||
		cache := grocksdb.NewLRUCache(cast.ToUint64(blockCacheSize))
 | 
					 | 
				
			||||||
		bbto.SetBlockCache(cache)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	bitsPerKey := appOpts.Get(bitsPerKeyBBTOOptName)
 | 
					 | 
				
			||||||
	if bitsPerKey != nil {
 | 
					 | 
				
			||||||
		filter := grocksdb.NewBloomFilter(cast.ToFloat64(bitsPerKey))
 | 
					 | 
				
			||||||
		bbto.SetFilterPolicy(filter)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	blockSize := appOpts.Get(blockSizeBBTOOptName)
 | 
					 | 
				
			||||||
	if blockSize != nil {
 | 
					 | 
				
			||||||
		bbto.SetBlockSize(cast.ToInt(blockSize))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	cacheIndexAndFilterBlocks := appOpts.Get(cacheIndexAndFilterBlocksBBTOOptName)
 | 
					 | 
				
			||||||
	if cacheIndexAndFilterBlocks != nil {
 | 
					 | 
				
			||||||
		bbto.SetCacheIndexAndFilterBlocks(cast.ToBool(cacheIndexAndFilterBlocks))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	pinL0FilterAndIndexBlocksInCache := appOpts.Get(pinL0FilterAndIndexBlocksInCacheBBTOOptName)
 | 
					 | 
				
			||||||
	if pinL0FilterAndIndexBlocksInCache != nil {
 | 
					 | 
				
			||||||
		bbto.SetPinL0FilterAndIndexBlocksInCache(cast.ToBool(pinL0FilterAndIndexBlocksInCache))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	formatVersion := appOpts.Get(formatVersionBBTOOptName)
 | 
					 | 
				
			||||||
	if formatVersion != nil {
 | 
					 | 
				
			||||||
		bbto.SetFormatVersion(cast.ToInt(formatVersion))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return bbto
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// newRocksDBWithOptions opens rocksdb with provided database and column family options
 | 
					 | 
				
			||||||
// newRocksDBWithOptions expects that db has only one column family named default
 | 
					 | 
				
			||||||
func newRocksDBWithOptions(
 | 
					 | 
				
			||||||
	name string,
 | 
					 | 
				
			||||||
	dir string,
 | 
					 | 
				
			||||||
	dbOpts *grocksdb.Options,
 | 
					 | 
				
			||||||
	cfOpts *grocksdb.Options,
 | 
					 | 
				
			||||||
	readOpts *grocksdb.ReadOptions,
 | 
					 | 
				
			||||||
	enableMetrics bool,
 | 
					 | 
				
			||||||
	reportMetricsIntervalSecs int64,
 | 
					 | 
				
			||||||
) (*dbm.RocksDB, error) {
 | 
					 | 
				
			||||||
	dbPath := filepath.Join(dir, name+".db")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Ensure path exists
 | 
					 | 
				
			||||||
	if err := os.MkdirAll(dbPath, 0755); err != nil {
 | 
					 | 
				
			||||||
		return nil, fmt.Errorf("failed to create db path: %w", err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// EnableStatistics adds overhead so shouldn't be enabled in production
 | 
					 | 
				
			||||||
	if enableMetrics {
 | 
					 | 
				
			||||||
		dbOpts.EnableStatistics()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	db, _, err := grocksdb.OpenDbColumnFamilies(dbOpts, dbPath, []string{DefaultColumnFamilyName}, []*grocksdb.Options{cfOpts})
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if enableMetrics {
 | 
					 | 
				
			||||||
		registerMetrics()
 | 
					 | 
				
			||||||
		go reportMetrics(db, time.Second*time.Duration(reportMetricsIntervalSecs))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	wo := grocksdb.NewDefaultWriteOptions()
 | 
					 | 
				
			||||||
	woSync := grocksdb.NewDefaultWriteOptions()
 | 
					 | 
				
			||||||
	woSync.SetSync(true)
 | 
					 | 
				
			||||||
	return dbm.NewRocksDBWithRawDB(db, readOpts, wo, woSync), nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// newDefaultOptions returns default tm-db options for RocksDB, see for details:
 | 
					 | 
				
			||||||
// https://github.com/Kava-Labs/tm-db/blob/94ff76d31724965f8883cddebabe91e0d01bc03f/rocksdb.go#L30
 | 
					 | 
				
			||||||
func newDefaultOptions() *grocksdb.Options {
 | 
					 | 
				
			||||||
	// default rocksdb option, good enough for most cases, including heavy workloads.
 | 
					 | 
				
			||||||
	// 1GB table cache, 512MB write buffer(may use 50% more on heavy workloads).
 | 
					 | 
				
			||||||
	// compression: snappy as default, need to -lsnappy to enable.
 | 
					 | 
				
			||||||
	bbto := defaultBBTO()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	opts := grocksdb.NewDefaultOptions()
 | 
					 | 
				
			||||||
	opts.SetBlockBasedTableFactory(bbto)
 | 
					 | 
				
			||||||
	// SetMaxOpenFiles to 4096 seems to provide a reliable performance boost
 | 
					 | 
				
			||||||
	opts.SetMaxOpenFiles(4096)
 | 
					 | 
				
			||||||
	opts.SetCreateIfMissing(true)
 | 
					 | 
				
			||||||
	opts.IncreaseParallelism(runtime.NumCPU())
 | 
					 | 
				
			||||||
	// 1.5GB maximum memory use for writebuffer.
 | 
					 | 
				
			||||||
	opts.OptimizeLevelStyleCompaction(512 * 1024 * 1024)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return opts
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// defaultBBTO returns default tm-db bbto options for RocksDB, see for details:
 | 
					 | 
				
			||||||
// https://github.com/Kava-Labs/tm-db/blob/94ff76d31724965f8883cddebabe91e0d01bc03f/rocksdb.go#L30
 | 
					 | 
				
			||||||
func defaultBBTO() *grocksdb.BlockBasedTableOptions {
 | 
					 | 
				
			||||||
	bbto := grocksdb.NewDefaultBlockBasedTableOptions()
 | 
					 | 
				
			||||||
	bbto.SetBlockCache(grocksdb.NewLRUCache(defaultBlockCacheSize))
 | 
					 | 
				
			||||||
	bbto.SetFilterPolicy(grocksdb.NewBloomFilter(10))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return bbto
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// reportMetrics periodically requests stats from rocksdb and reports to prometheus
 | 
					 | 
				
			||||||
// NOTE: should be launched as a goroutine
 | 
					 | 
				
			||||||
func reportMetrics(db *grocksdb.DB, interval time.Duration) {
 | 
					 | 
				
			||||||
	ticker := time.NewTicker(interval)
 | 
					 | 
				
			||||||
	for {
 | 
					 | 
				
			||||||
		select {
 | 
					 | 
				
			||||||
		case <-ticker.C:
 | 
					 | 
				
			||||||
			props, stats, err := getPropsAndStats(db)
 | 
					 | 
				
			||||||
			if err != nil {
 | 
					 | 
				
			||||||
				continue
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			rocksdbMetrics.report(props, stats)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// getPropsAndStats gets statistics from rocksdb
 | 
					 | 
				
			||||||
func getPropsAndStats(db *grocksdb.DB) (*properties, *stats, error) {
 | 
					 | 
				
			||||||
	propsLoader := newPropsLoader(db)
 | 
					 | 
				
			||||||
	props, err := propsLoader.load()
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	statMap, err := parseSerializedStats(props.OptionsStatistics)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	statLoader := newStatLoader(statMap)
 | 
					 | 
				
			||||||
	stats, err := statLoader.load()
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return props, stats, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,384 +0,0 @@
 | 
				
			|||||||
//go:build rocksdb
 | 
					 | 
				
			||||||
// +build rocksdb
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package opendb
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"os"
 | 
					 | 
				
			||||||
	"path/filepath"
 | 
					 | 
				
			||||||
	"testing"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"github.com/linxGnu/grocksdb"
 | 
					 | 
				
			||||||
	"github.com/stretchr/testify/require"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type mockAppOptions struct {
 | 
					 | 
				
			||||||
	opts map[string]interface{}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func newMockAppOptions(opts map[string]interface{}) *mockAppOptions {
 | 
					 | 
				
			||||||
	return &mockAppOptions{
 | 
					 | 
				
			||||||
		opts: opts,
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (m *mockAppOptions) Get(key string) interface{} {
 | 
					 | 
				
			||||||
	return m.opts[key]
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func TestOpenRocksdb(t *testing.T) {
 | 
					 | 
				
			||||||
	t.Run("db already exists", func(t *testing.T) {
 | 
					 | 
				
			||||||
		defaultOpts := newDefaultOptions()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		for _, tc := range []struct {
 | 
					 | 
				
			||||||
			desc                  string
 | 
					 | 
				
			||||||
			mockAppOptions        *mockAppOptions
 | 
					 | 
				
			||||||
			maxOpenFiles          int
 | 
					 | 
				
			||||||
			maxFileOpeningThreads int
 | 
					 | 
				
			||||||
			writeBufferSize       uint64
 | 
					 | 
				
			||||||
			numLevels             int
 | 
					 | 
				
			||||||
		}{
 | 
					 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				desc:                  "default options",
 | 
					 | 
				
			||||||
				mockAppOptions:        newMockAppOptions(map[string]interface{}{}),
 | 
					 | 
				
			||||||
				maxOpenFiles:          defaultOpts.GetMaxOpenFiles(),
 | 
					 | 
				
			||||||
				maxFileOpeningThreads: defaultOpts.GetMaxFileOpeningThreads(),
 | 
					 | 
				
			||||||
				writeBufferSize:       defaultOpts.GetWriteBufferSize(),
 | 
					 | 
				
			||||||
				numLevels:             defaultOpts.GetNumLevels(),
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				desc: "change 2 options",
 | 
					 | 
				
			||||||
				mockAppOptions: newMockAppOptions(map[string]interface{}{
 | 
					 | 
				
			||||||
					maxOpenFilesDBOptName:    999,
 | 
					 | 
				
			||||||
					writeBufferSizeCFOptName: 999_999,
 | 
					 | 
				
			||||||
				}),
 | 
					 | 
				
			||||||
				maxOpenFiles:          999,
 | 
					 | 
				
			||||||
				maxFileOpeningThreads: defaultOpts.GetMaxFileOpeningThreads(),
 | 
					 | 
				
			||||||
				writeBufferSize:       999_999,
 | 
					 | 
				
			||||||
				numLevels:             defaultOpts.GetNumLevels(),
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				desc: "change 4 options",
 | 
					 | 
				
			||||||
				mockAppOptions: newMockAppOptions(map[string]interface{}{
 | 
					 | 
				
			||||||
					maxOpenFilesDBOptName:          999,
 | 
					 | 
				
			||||||
					maxFileOpeningThreadsDBOptName: 9,
 | 
					 | 
				
			||||||
					writeBufferSizeCFOptName:       999_999,
 | 
					 | 
				
			||||||
					numLevelsCFOptName:             9,
 | 
					 | 
				
			||||||
				}),
 | 
					 | 
				
			||||||
				maxOpenFiles:          999,
 | 
					 | 
				
			||||||
				maxFileOpeningThreads: 9,
 | 
					 | 
				
			||||||
				writeBufferSize:       999_999,
 | 
					 | 
				
			||||||
				numLevels:             9,
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
		} {
 | 
					 | 
				
			||||||
			t.Run(tc.desc, func(t *testing.T) {
 | 
					 | 
				
			||||||
				dir, err := os.MkdirTemp("", "rocksdb")
 | 
					 | 
				
			||||||
				require.NoError(t, err)
 | 
					 | 
				
			||||||
				defer func() {
 | 
					 | 
				
			||||||
					err := os.RemoveAll(dir)
 | 
					 | 
				
			||||||
					require.NoError(t, err)
 | 
					 | 
				
			||||||
				}()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				db, err := openRocksdb(dir, tc.mockAppOptions)
 | 
					 | 
				
			||||||
				require.NoError(t, err)
 | 
					 | 
				
			||||||
				require.NoError(t, db.Close())
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				dbOpts, cfOpts, err := LoadLatestOptions(filepath.Join(dir, "application.db"))
 | 
					 | 
				
			||||||
				require.NoError(t, err)
 | 
					 | 
				
			||||||
				require.Equal(t, tc.maxOpenFiles, dbOpts.GetMaxOpenFiles())
 | 
					 | 
				
			||||||
				require.Equal(t, tc.maxFileOpeningThreads, dbOpts.GetMaxFileOpeningThreads())
 | 
					 | 
				
			||||||
				require.Equal(t, tc.writeBufferSize, cfOpts.GetWriteBufferSize())
 | 
					 | 
				
			||||||
				require.Equal(t, tc.numLevels, cfOpts.GetNumLevels())
 | 
					 | 
				
			||||||
			})
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	t.Run("db doesn't exist yet", func(t *testing.T) {
 | 
					 | 
				
			||||||
		defaultOpts := newDefaultOptions()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		dir, err := os.MkdirTemp("", "rocksdb")
 | 
					 | 
				
			||||||
		require.NoError(t, err)
 | 
					 | 
				
			||||||
		defer func() {
 | 
					 | 
				
			||||||
			err := os.RemoveAll(dir)
 | 
					 | 
				
			||||||
			require.NoError(t, err)
 | 
					 | 
				
			||||||
		}()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		mockAppOpts := newMockAppOptions(map[string]interface{}{})
 | 
					 | 
				
			||||||
		db, err := openRocksdb(dir, mockAppOpts)
 | 
					 | 
				
			||||||
		require.NoError(t, err)
 | 
					 | 
				
			||||||
		require.NoError(t, db.Close())
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		dbOpts, cfOpts, err := LoadLatestOptions(filepath.Join(dir, "application.db"))
 | 
					 | 
				
			||||||
		require.NoError(t, err)
 | 
					 | 
				
			||||||
		require.Equal(t, defaultOpts.GetMaxOpenFiles(), dbOpts.GetMaxOpenFiles())
 | 
					 | 
				
			||||||
		require.Equal(t, defaultOpts.GetMaxFileOpeningThreads(), dbOpts.GetMaxFileOpeningThreads())
 | 
					 | 
				
			||||||
		require.Equal(t, defaultOpts.GetWriteBufferSize(), cfOpts.GetWriteBufferSize())
 | 
					 | 
				
			||||||
		require.Equal(t, defaultOpts.GetNumLevels(), cfOpts.GetNumLevels())
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func TestLoadLatestOptions(t *testing.T) {
 | 
					 | 
				
			||||||
	t.Run("db already exists", func(t *testing.T) {
 | 
					 | 
				
			||||||
		defaultOpts := newDefaultOptions()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		const testCasesNum = 3
 | 
					 | 
				
			||||||
		dbOptsList := make([]*grocksdb.Options, testCasesNum)
 | 
					 | 
				
			||||||
		cfOptsList := make([]*grocksdb.Options, testCasesNum)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		dbOptsList[0] = newDefaultOptions()
 | 
					 | 
				
			||||||
		cfOptsList[0] = newDefaultOptions()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		dbOptsList[1] = newDefaultOptions()
 | 
					 | 
				
			||||||
		dbOptsList[1].SetMaxOpenFiles(999)
 | 
					 | 
				
			||||||
		cfOptsList[1] = newDefaultOptions()
 | 
					 | 
				
			||||||
		cfOptsList[1].SetWriteBufferSize(999_999)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		dbOptsList[2] = newDefaultOptions()
 | 
					 | 
				
			||||||
		dbOptsList[2].SetMaxOpenFiles(999)
 | 
					 | 
				
			||||||
		dbOptsList[2].SetMaxFileOpeningThreads(9)
 | 
					 | 
				
			||||||
		cfOptsList[2] = newDefaultOptions()
 | 
					 | 
				
			||||||
		cfOptsList[2].SetWriteBufferSize(999_999)
 | 
					 | 
				
			||||||
		cfOptsList[2].SetNumLevels(9)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		for _, tc := range []struct {
 | 
					 | 
				
			||||||
			desc                  string
 | 
					 | 
				
			||||||
			dbOpts                *grocksdb.Options
 | 
					 | 
				
			||||||
			cfOpts                *grocksdb.Options
 | 
					 | 
				
			||||||
			maxOpenFiles          int
 | 
					 | 
				
			||||||
			maxFileOpeningThreads int
 | 
					 | 
				
			||||||
			writeBufferSize       uint64
 | 
					 | 
				
			||||||
			numLevels             int
 | 
					 | 
				
			||||||
		}{
 | 
					 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				desc:                  "default options",
 | 
					 | 
				
			||||||
				dbOpts:                dbOptsList[0],
 | 
					 | 
				
			||||||
				cfOpts:                cfOptsList[0],
 | 
					 | 
				
			||||||
				maxOpenFiles:          defaultOpts.GetMaxOpenFiles(),
 | 
					 | 
				
			||||||
				maxFileOpeningThreads: defaultOpts.GetMaxFileOpeningThreads(),
 | 
					 | 
				
			||||||
				writeBufferSize:       defaultOpts.GetWriteBufferSize(),
 | 
					 | 
				
			||||||
				numLevels:             defaultOpts.GetNumLevels(),
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				desc:                  "change 2 options",
 | 
					 | 
				
			||||||
				dbOpts:                dbOptsList[1],
 | 
					 | 
				
			||||||
				cfOpts:                cfOptsList[1],
 | 
					 | 
				
			||||||
				maxOpenFiles:          999,
 | 
					 | 
				
			||||||
				maxFileOpeningThreads: defaultOpts.GetMaxFileOpeningThreads(),
 | 
					 | 
				
			||||||
				writeBufferSize:       999_999,
 | 
					 | 
				
			||||||
				numLevels:             defaultOpts.GetNumLevels(),
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				desc:                  "change 4 options",
 | 
					 | 
				
			||||||
				dbOpts:                dbOptsList[2],
 | 
					 | 
				
			||||||
				cfOpts:                cfOptsList[2],
 | 
					 | 
				
			||||||
				maxOpenFiles:          999,
 | 
					 | 
				
			||||||
				maxFileOpeningThreads: 9,
 | 
					 | 
				
			||||||
				writeBufferSize:       999_999,
 | 
					 | 
				
			||||||
				numLevels:             9,
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
		} {
 | 
					 | 
				
			||||||
			t.Run(tc.desc, func(t *testing.T) {
 | 
					 | 
				
			||||||
				name := "application"
 | 
					 | 
				
			||||||
				dir, err := os.MkdirTemp("", "rocksdb")
 | 
					 | 
				
			||||||
				require.NoError(t, err)
 | 
					 | 
				
			||||||
				defer func() {
 | 
					 | 
				
			||||||
					err := os.RemoveAll(dir)
 | 
					 | 
				
			||||||
					require.NoError(t, err)
 | 
					 | 
				
			||||||
				}()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				db, err := newRocksDBWithOptions(name, dir, tc.dbOpts, tc.cfOpts, grocksdb.NewDefaultReadOptions(), true, defaultReportMetricsIntervalSecs)
 | 
					 | 
				
			||||||
				require.NoError(t, err)
 | 
					 | 
				
			||||||
				require.NoError(t, db.Close())
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				dbOpts, cfOpts, err := LoadLatestOptions(filepath.Join(dir, "application.db"))
 | 
					 | 
				
			||||||
				require.NoError(t, err)
 | 
					 | 
				
			||||||
				require.Equal(t, tc.maxOpenFiles, dbOpts.GetMaxOpenFiles())
 | 
					 | 
				
			||||||
				require.Equal(t, tc.maxFileOpeningThreads, dbOpts.GetMaxFileOpeningThreads())
 | 
					 | 
				
			||||||
				require.Equal(t, tc.writeBufferSize, cfOpts.GetWriteBufferSize())
 | 
					 | 
				
			||||||
				require.Equal(t, tc.numLevels, cfOpts.GetNumLevels())
 | 
					 | 
				
			||||||
			})
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	t.Run("db doesn't exist yet", func(t *testing.T) {
 | 
					 | 
				
			||||||
		defaultOpts := newDefaultOptions()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		dir, err := os.MkdirTemp("", "rocksdb")
 | 
					 | 
				
			||||||
		require.NoError(t, err)
 | 
					 | 
				
			||||||
		defer func() {
 | 
					 | 
				
			||||||
			err := os.RemoveAll(dir)
 | 
					 | 
				
			||||||
			require.NoError(t, err)
 | 
					 | 
				
			||||||
		}()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		dbOpts, cfOpts, err := LoadLatestOptions(filepath.Join(dir, "application.db"))
 | 
					 | 
				
			||||||
		require.NoError(t, err)
 | 
					 | 
				
			||||||
		require.Equal(t, defaultOpts.GetMaxOpenFiles(), dbOpts.GetMaxOpenFiles())
 | 
					 | 
				
			||||||
		require.Equal(t, defaultOpts.GetMaxFileOpeningThreads(), dbOpts.GetMaxFileOpeningThreads())
 | 
					 | 
				
			||||||
		require.Equal(t, defaultOpts.GetWriteBufferSize(), cfOpts.GetWriteBufferSize())
 | 
					 | 
				
			||||||
		require.Equal(t, defaultOpts.GetNumLevels(), cfOpts.GetNumLevels())
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func TestOverrideDBOpts(t *testing.T) {
 | 
					 | 
				
			||||||
	defaultOpts := newDefaultOptions()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for _, tc := range []struct {
 | 
					 | 
				
			||||||
		desc                  string
 | 
					 | 
				
			||||||
		mockAppOptions        *mockAppOptions
 | 
					 | 
				
			||||||
		maxOpenFiles          int
 | 
					 | 
				
			||||||
		maxFileOpeningThreads int
 | 
					 | 
				
			||||||
	}{
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			desc:                  "override nothing",
 | 
					 | 
				
			||||||
			mockAppOptions:        newMockAppOptions(map[string]interface{}{}),
 | 
					 | 
				
			||||||
			maxOpenFiles:          defaultOpts.GetMaxOpenFiles(),
 | 
					 | 
				
			||||||
			maxFileOpeningThreads: defaultOpts.GetMaxFileOpeningThreads(),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			desc: "override max-open-files",
 | 
					 | 
				
			||||||
			mockAppOptions: newMockAppOptions(map[string]interface{}{
 | 
					 | 
				
			||||||
				maxOpenFilesDBOptName: 999,
 | 
					 | 
				
			||||||
			}),
 | 
					 | 
				
			||||||
			maxOpenFiles:          999,
 | 
					 | 
				
			||||||
			maxFileOpeningThreads: defaultOpts.GetMaxFileOpeningThreads(),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			desc: "override max-file-opening-threads",
 | 
					 | 
				
			||||||
			mockAppOptions: newMockAppOptions(map[string]interface{}{
 | 
					 | 
				
			||||||
				maxFileOpeningThreadsDBOptName: 9,
 | 
					 | 
				
			||||||
			}),
 | 
					 | 
				
			||||||
			maxOpenFiles:          defaultOpts.GetMaxOpenFiles(),
 | 
					 | 
				
			||||||
			maxFileOpeningThreads: 9,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			desc: "override max-open-files and max-file-opening-threads",
 | 
					 | 
				
			||||||
			mockAppOptions: newMockAppOptions(map[string]interface{}{
 | 
					 | 
				
			||||||
				maxOpenFilesDBOptName:          999,
 | 
					 | 
				
			||||||
				maxFileOpeningThreadsDBOptName: 9,
 | 
					 | 
				
			||||||
			}),
 | 
					 | 
				
			||||||
			maxOpenFiles:          999,
 | 
					 | 
				
			||||||
			maxFileOpeningThreads: 9,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	} {
 | 
					 | 
				
			||||||
		t.Run(tc.desc, func(t *testing.T) {
 | 
					 | 
				
			||||||
			dbOpts := newDefaultOptions()
 | 
					 | 
				
			||||||
			dbOpts = overrideDBOpts(dbOpts, tc.mockAppOptions)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			require.Equal(t, tc.maxOpenFiles, dbOpts.GetMaxOpenFiles())
 | 
					 | 
				
			||||||
			require.Equal(t, tc.maxFileOpeningThreads, dbOpts.GetMaxFileOpeningThreads())
 | 
					 | 
				
			||||||
		})
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func TestOverrideCFOpts(t *testing.T) {
 | 
					 | 
				
			||||||
	defaultOpts := newDefaultOptions()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for _, tc := range []struct {
 | 
					 | 
				
			||||||
		desc            string
 | 
					 | 
				
			||||||
		mockAppOptions  *mockAppOptions
 | 
					 | 
				
			||||||
		writeBufferSize uint64
 | 
					 | 
				
			||||||
		numLevels       int
 | 
					 | 
				
			||||||
	}{
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			desc:            "override nothing",
 | 
					 | 
				
			||||||
			mockAppOptions:  newMockAppOptions(map[string]interface{}{}),
 | 
					 | 
				
			||||||
			writeBufferSize: defaultOpts.GetWriteBufferSize(),
 | 
					 | 
				
			||||||
			numLevels:       defaultOpts.GetNumLevels(),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			desc: "override write-buffer-size",
 | 
					 | 
				
			||||||
			mockAppOptions: newMockAppOptions(map[string]interface{}{
 | 
					 | 
				
			||||||
				writeBufferSizeCFOptName: 999_999,
 | 
					 | 
				
			||||||
			}),
 | 
					 | 
				
			||||||
			writeBufferSize: 999_999,
 | 
					 | 
				
			||||||
			numLevels:       defaultOpts.GetNumLevels(),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			desc: "override num-levels",
 | 
					 | 
				
			||||||
			mockAppOptions: newMockAppOptions(map[string]interface{}{
 | 
					 | 
				
			||||||
				numLevelsCFOptName: 9,
 | 
					 | 
				
			||||||
			}),
 | 
					 | 
				
			||||||
			writeBufferSize: defaultOpts.GetWriteBufferSize(),
 | 
					 | 
				
			||||||
			numLevels:       9,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			desc: "override write-buffer-size and num-levels",
 | 
					 | 
				
			||||||
			mockAppOptions: newMockAppOptions(map[string]interface{}{
 | 
					 | 
				
			||||||
				writeBufferSizeCFOptName: 999_999,
 | 
					 | 
				
			||||||
				numLevelsCFOptName:       9,
 | 
					 | 
				
			||||||
			}),
 | 
					 | 
				
			||||||
			writeBufferSize: 999_999,
 | 
					 | 
				
			||||||
			numLevels:       9,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	} {
 | 
					 | 
				
			||||||
		t.Run(tc.desc, func(t *testing.T) {
 | 
					 | 
				
			||||||
			cfOpts := newDefaultOptions()
 | 
					 | 
				
			||||||
			cfOpts = overrideCFOpts(cfOpts, tc.mockAppOptions)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			require.Equal(t, tc.writeBufferSize, cfOpts.GetWriteBufferSize())
 | 
					 | 
				
			||||||
			require.Equal(t, tc.numLevels, cfOpts.GetNumLevels())
 | 
					 | 
				
			||||||
		})
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func TestReadOptsFromAppOpts(t *testing.T) {
 | 
					 | 
				
			||||||
	for _, tc := range []struct {
 | 
					 | 
				
			||||||
		desc           string
 | 
					 | 
				
			||||||
		mockAppOptions *mockAppOptions
 | 
					 | 
				
			||||||
		asyncIO        bool
 | 
					 | 
				
			||||||
	}{
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			desc:           "default options",
 | 
					 | 
				
			||||||
			mockAppOptions: newMockAppOptions(map[string]interface{}{}),
 | 
					 | 
				
			||||||
			asyncIO:        false,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			desc: "set asyncIO option to true",
 | 
					 | 
				
			||||||
			mockAppOptions: newMockAppOptions(map[string]interface{}{
 | 
					 | 
				
			||||||
				asyncIOReadOptName: true,
 | 
					 | 
				
			||||||
			}),
 | 
					 | 
				
			||||||
			asyncIO: true,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	} {
 | 
					 | 
				
			||||||
		t.Run(tc.desc, func(t *testing.T) {
 | 
					 | 
				
			||||||
			readOpts := readOptsFromAppOpts(tc.mockAppOptions)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			require.Equal(t, tc.asyncIO, readOpts.IsAsyncIO())
 | 
					 | 
				
			||||||
		})
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func TestNewRocksDBWithOptions(t *testing.T) {
 | 
					 | 
				
			||||||
	defaultOpts := newDefaultOptions()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	name := "application"
 | 
					 | 
				
			||||||
	dir, err := os.MkdirTemp("", "rocksdb")
 | 
					 | 
				
			||||||
	require.NoError(t, err)
 | 
					 | 
				
			||||||
	defer func() {
 | 
					 | 
				
			||||||
		err := os.RemoveAll(dir)
 | 
					 | 
				
			||||||
		require.NoError(t, err)
 | 
					 | 
				
			||||||
	}()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	dbOpts := newDefaultOptions()
 | 
					 | 
				
			||||||
	dbOpts.SetMaxOpenFiles(999)
 | 
					 | 
				
			||||||
	cfOpts := newDefaultOptions()
 | 
					 | 
				
			||||||
	cfOpts.SetWriteBufferSize(999_999)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	db, err := newRocksDBWithOptions(name, dir, dbOpts, cfOpts, grocksdb.NewDefaultReadOptions(), true, defaultReportMetricsIntervalSecs)
 | 
					 | 
				
			||||||
	require.NoError(t, err)
 | 
					 | 
				
			||||||
	require.NoError(t, db.Close())
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	dbOpts, cfOpts, err = LoadLatestOptions(filepath.Join(dir, "application.db"))
 | 
					 | 
				
			||||||
	require.NoError(t, err)
 | 
					 | 
				
			||||||
	require.Equal(t, 999, dbOpts.GetMaxOpenFiles())
 | 
					 | 
				
			||||||
	require.Equal(t, defaultOpts.GetMaxFileOpeningThreads(), dbOpts.GetMaxFileOpeningThreads())
 | 
					 | 
				
			||||||
	require.Equal(t, uint64(999_999), cfOpts.GetWriteBufferSize())
 | 
					 | 
				
			||||||
	require.Equal(t, defaultOpts.GetNumLevels(), dbOpts.GetNumLevels())
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func TestNewDefaultOptions(t *testing.T) {
 | 
					 | 
				
			||||||
	defaultOpts := newDefaultOptions()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	maxOpenFiles := defaultOpts.GetMaxOpenFiles()
 | 
					 | 
				
			||||||
	require.Equal(t, 4096, maxOpenFiles)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,87 +0,0 @@
 | 
				
			|||||||
//go:build rocksdb
 | 
					 | 
				
			||||||
// +build rocksdb
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package opendb
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"strings"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"errors"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type propsGetter interface {
 | 
					 | 
				
			||||||
	GetProperty(propName string) (value string)
 | 
					 | 
				
			||||||
	GetIntProperty(propName string) (value uint64, success bool)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type propsLoader struct {
 | 
					 | 
				
			||||||
	db        propsGetter
 | 
					 | 
				
			||||||
	errorMsgs []string
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func newPropsLoader(db propsGetter) *propsLoader {
 | 
					 | 
				
			||||||
	return &propsLoader{
 | 
					 | 
				
			||||||
		db:        db,
 | 
					 | 
				
			||||||
		errorMsgs: make([]string, 0),
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (l *propsLoader) load() (*properties, error) {
 | 
					 | 
				
			||||||
	props := &properties{
 | 
					 | 
				
			||||||
		BaseLevel:               l.getIntProperty("rocksdb.base-level"),
 | 
					 | 
				
			||||||
		BlockCacheCapacity:      l.getIntProperty("rocksdb.block-cache-capacity"),
 | 
					 | 
				
			||||||
		BlockCachePinnedUsage:   l.getIntProperty("rocksdb.block-cache-pinned-usage"),
 | 
					 | 
				
			||||||
		BlockCacheUsage:         l.getIntProperty("rocksdb.block-cache-usage"),
 | 
					 | 
				
			||||||
		CurSizeActiveMemTable:   l.getIntProperty("rocksdb.cur-size-active-mem-table"),
 | 
					 | 
				
			||||||
		CurSizeAllMemTables:     l.getIntProperty("rocksdb.cur-size-all-mem-tables"),
 | 
					 | 
				
			||||||
		EstimateLiveDataSize:    l.getIntProperty("rocksdb.estimate-live-data-size"),
 | 
					 | 
				
			||||||
		EstimateNumKeys:         l.getIntProperty("rocksdb.estimate-num-keys"),
 | 
					 | 
				
			||||||
		EstimateTableReadersMem: l.getIntProperty("rocksdb.estimate-table-readers-mem"),
 | 
					 | 
				
			||||||
		LiveSSTFilesSize:        l.getIntProperty("rocksdb.live-sst-files-size"),
 | 
					 | 
				
			||||||
		SizeAllMemTables:        l.getIntProperty("rocksdb.size-all-mem-tables"),
 | 
					 | 
				
			||||||
		OptionsStatistics:       l.getProperty("rocksdb.options-statistics"),
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if len(l.errorMsgs) != 0 {
 | 
					 | 
				
			||||||
		errorMsg := strings.Join(l.errorMsgs, ";")
 | 
					 | 
				
			||||||
		return nil, errors.New(errorMsg)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return props, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (l *propsLoader) getProperty(propName string) string {
 | 
					 | 
				
			||||||
	value := l.db.GetProperty(propName)
 | 
					 | 
				
			||||||
	if value == "" {
 | 
					 | 
				
			||||||
		l.errorMsgs = append(l.errorMsgs, fmt.Sprintf("property %v is empty", propName))
 | 
					 | 
				
			||||||
		return ""
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return value
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (l *propsLoader) getIntProperty(propName string) uint64 {
 | 
					 | 
				
			||||||
	value, ok := l.db.GetIntProperty(propName)
 | 
					 | 
				
			||||||
	if !ok {
 | 
					 | 
				
			||||||
		l.errorMsgs = append(l.errorMsgs, fmt.Sprintf("can't get %v int property", propName))
 | 
					 | 
				
			||||||
		return 0
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return value
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type properties struct {
 | 
					 | 
				
			||||||
	BaseLevel               uint64
 | 
					 | 
				
			||||||
	BlockCacheCapacity      uint64
 | 
					 | 
				
			||||||
	BlockCachePinnedUsage   uint64
 | 
					 | 
				
			||||||
	BlockCacheUsage         uint64
 | 
					 | 
				
			||||||
	CurSizeActiveMemTable   uint64
 | 
					 | 
				
			||||||
	CurSizeAllMemTables     uint64
 | 
					 | 
				
			||||||
	EstimateLiveDataSize    uint64
 | 
					 | 
				
			||||||
	EstimateNumKeys         uint64
 | 
					 | 
				
			||||||
	EstimateTableReadersMem uint64
 | 
					 | 
				
			||||||
	LiveSSTFilesSize        uint64
 | 
					 | 
				
			||||||
	SizeAllMemTables        uint64
 | 
					 | 
				
			||||||
	OptionsStatistics       string
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,112 +0,0 @@
 | 
				
			|||||||
//go:build rocksdb
 | 
					 | 
				
			||||||
// +build rocksdb
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package opendb
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"testing"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"github.com/stretchr/testify/require"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type mockPropsGetter struct {
 | 
					 | 
				
			||||||
	props    map[string]string
 | 
					 | 
				
			||||||
	intProps map[string]uint64
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func newMockPropsGetter(
 | 
					 | 
				
			||||||
	props map[string]string,
 | 
					 | 
				
			||||||
	intProps map[string]uint64,
 | 
					 | 
				
			||||||
) *mockPropsGetter {
 | 
					 | 
				
			||||||
	return &mockPropsGetter{
 | 
					 | 
				
			||||||
		props:    props,
 | 
					 | 
				
			||||||
		intProps: intProps,
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (m *mockPropsGetter) GetProperty(propName string) string {
 | 
					 | 
				
			||||||
	return m.props[propName]
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (m *mockPropsGetter) GetIntProperty(propName string) (uint64, bool) {
 | 
					 | 
				
			||||||
	prop, ok := m.intProps[propName]
 | 
					 | 
				
			||||||
	return prop, ok
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func TestPropsLoader(t *testing.T) {
 | 
					 | 
				
			||||||
	defaultProps := map[string]string{
 | 
					 | 
				
			||||||
		"rocksdb.options-statistics": "1",
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	defaultIntProps := map[string]uint64{
 | 
					 | 
				
			||||||
		"rocksdb.base-level":                 1,
 | 
					 | 
				
			||||||
		"rocksdb.block-cache-capacity":       2,
 | 
					 | 
				
			||||||
		"rocksdb.block-cache-pinned-usage":   3,
 | 
					 | 
				
			||||||
		"rocksdb.block-cache-usage":          4,
 | 
					 | 
				
			||||||
		"rocksdb.cur-size-active-mem-table":  5,
 | 
					 | 
				
			||||||
		"rocksdb.cur-size-all-mem-tables":    6,
 | 
					 | 
				
			||||||
		"rocksdb.estimate-live-data-size":    7,
 | 
					 | 
				
			||||||
		"rocksdb.estimate-num-keys":          8,
 | 
					 | 
				
			||||||
		"rocksdb.estimate-table-readers-mem": 9,
 | 
					 | 
				
			||||||
		"rocksdb.live-sst-files-size":        10,
 | 
					 | 
				
			||||||
		"rocksdb.size-all-mem-tables":        11,
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	missingProps := make(map[string]string)
 | 
					 | 
				
			||||||
	missingIntProps := make(map[string]uint64)
 | 
					 | 
				
			||||||
	defaultExpectedProps := properties{
 | 
					 | 
				
			||||||
		BaseLevel:               1,
 | 
					 | 
				
			||||||
		BlockCacheCapacity:      2,
 | 
					 | 
				
			||||||
		BlockCachePinnedUsage:   3,
 | 
					 | 
				
			||||||
		BlockCacheUsage:         4,
 | 
					 | 
				
			||||||
		CurSizeActiveMemTable:   5,
 | 
					 | 
				
			||||||
		CurSizeAllMemTables:     6,
 | 
					 | 
				
			||||||
		EstimateLiveDataSize:    7,
 | 
					 | 
				
			||||||
		EstimateNumKeys:         8,
 | 
					 | 
				
			||||||
		EstimateTableReadersMem: 9,
 | 
					 | 
				
			||||||
		LiveSSTFilesSize:        10,
 | 
					 | 
				
			||||||
		SizeAllMemTables:        11,
 | 
					 | 
				
			||||||
		OptionsStatistics:       "1",
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for _, tc := range []struct {
 | 
					 | 
				
			||||||
		desc          string
 | 
					 | 
				
			||||||
		props         map[string]string
 | 
					 | 
				
			||||||
		intProps      map[string]uint64
 | 
					 | 
				
			||||||
		expectedProps *properties
 | 
					 | 
				
			||||||
		success       bool
 | 
					 | 
				
			||||||
	}{
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			desc:          "success case",
 | 
					 | 
				
			||||||
			props:         defaultProps,
 | 
					 | 
				
			||||||
			intProps:      defaultIntProps,
 | 
					 | 
				
			||||||
			expectedProps: &defaultExpectedProps,
 | 
					 | 
				
			||||||
			success:       true,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			desc:          "missing props",
 | 
					 | 
				
			||||||
			props:         missingProps,
 | 
					 | 
				
			||||||
			intProps:      defaultIntProps,
 | 
					 | 
				
			||||||
			expectedProps: nil,
 | 
					 | 
				
			||||||
			success:       false,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			desc:          "missing integer props",
 | 
					 | 
				
			||||||
			props:         defaultProps,
 | 
					 | 
				
			||||||
			intProps:      missingIntProps,
 | 
					 | 
				
			||||||
			expectedProps: nil,
 | 
					 | 
				
			||||||
			success:       false,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	} {
 | 
					 | 
				
			||||||
		t.Run(tc.desc, func(t *testing.T) {
 | 
					 | 
				
			||||||
			mockPropsGetter := newMockPropsGetter(tc.props, tc.intProps)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			propsLoader := newPropsLoader(mockPropsGetter)
 | 
					 | 
				
			||||||
			actualProps, err := propsLoader.load()
 | 
					 | 
				
			||||||
			if tc.success {
 | 
					 | 
				
			||||||
				require.NoError(t, err)
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				require.Error(t, err)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			require.Equal(t, tc.expectedProps, actualProps)
 | 
					 | 
				
			||||||
		})
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,111 +0,0 @@
 | 
				
			|||||||
//go:build rocksdb
 | 
					 | 
				
			||||||
// +build rocksdb
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package opendb
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"strings"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"errors"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// stat represents one line from rocksdb statistics data, stat may have one or more properties
 | 
					 | 
				
			||||||
// examples:
 | 
					 | 
				
			||||||
// - rocksdb.block.cache.miss COUNT : 5
 | 
					 | 
				
			||||||
// - rocksdb.compaction.times.micros P50 : 21112 P95 : 21112 P99 : 21112 P100 : 21112 COUNT : 1 SUM : 21112
 | 
					 | 
				
			||||||
// `rocksdb.compaction.times.micros` is name of stat, P50, COUNT, SUM, etc... are props of stat
 | 
					 | 
				
			||||||
type stat struct {
 | 
					 | 
				
			||||||
	name  string
 | 
					 | 
				
			||||||
	props map[string]string
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// parseSerializedStats parses serialisedStats into map of stat objects
 | 
					 | 
				
			||||||
// example of serializedStats:
 | 
					 | 
				
			||||||
// rocksdb.block.cache.miss COUNT : 5
 | 
					 | 
				
			||||||
// rocksdb.compaction.times.micros P50 : 21112 P95 : 21112 P99 : 21112 P100 : 21112 COUNT : 1 SUM : 21112
 | 
					 | 
				
			||||||
func parseSerializedStats(serializedStats string) (map[string]*stat, error) {
 | 
					 | 
				
			||||||
	stats := make(map[string]*stat, 0)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	serializedStatList := strings.Split(serializedStats, "\n")
 | 
					 | 
				
			||||||
	if len(serializedStatList) == 0 {
 | 
					 | 
				
			||||||
		return nil, errors.New("serializedStats is empty")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	serializedStatList = serializedStatList[:len(serializedStatList)-1]
 | 
					 | 
				
			||||||
	// iterate over stats line by line
 | 
					 | 
				
			||||||
	for _, serializedStat := range serializedStatList {
 | 
					 | 
				
			||||||
		stat, err := parseSerializedStat(serializedStat)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		stats[stat.name] = stat
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return stats, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// parseSerializedStat parses serialisedStat into stat object
 | 
					 | 
				
			||||||
// example of serializedStat:
 | 
					 | 
				
			||||||
// rocksdb.block.cache.miss COUNT : 5
 | 
					 | 
				
			||||||
func parseSerializedStat(serializedStat string) (*stat, error) {
 | 
					 | 
				
			||||||
	tokens := strings.Split(serializedStat, " ")
 | 
					 | 
				
			||||||
	tokensNum := len(tokens)
 | 
					 | 
				
			||||||
	if err := validateTokens(tokens); err != nil {
 | 
					 | 
				
			||||||
		return nil, fmt.Errorf("tokens are invalid: %v", err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	props := make(map[string]string)
 | 
					 | 
				
			||||||
	for idx := 1; idx < tokensNum; idx += 3 {
 | 
					 | 
				
			||||||
		// never should happen, but double check to avoid unexpected panic
 | 
					 | 
				
			||||||
		if idx+2 >= tokensNum {
 | 
					 | 
				
			||||||
			break
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		key := tokens[idx]
 | 
					 | 
				
			||||||
		sep := tokens[idx+1]
 | 
					 | 
				
			||||||
		value := tokens[idx+2]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if err := validateStatProperty(key, value, sep); err != nil {
 | 
					 | 
				
			||||||
			return nil, fmt.Errorf("invalid stat property: %v", err)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		props[key] = value
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return &stat{
 | 
					 | 
				
			||||||
		name:  tokens[0],
 | 
					 | 
				
			||||||
		props: props,
 | 
					 | 
				
			||||||
	}, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// validateTokens validates that tokens contains name + N triples (key, sep, value)
 | 
					 | 
				
			||||||
func validateTokens(tokens []string) error {
 | 
					 | 
				
			||||||
	tokensNum := len(tokens)
 | 
					 | 
				
			||||||
	if tokensNum < 4 {
 | 
					 | 
				
			||||||
		return fmt.Errorf("invalid number of tokens: %v, tokens: %v", tokensNum, tokens)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if (tokensNum-1)%3 != 0 {
 | 
					 | 
				
			||||||
		return fmt.Errorf("invalid number of tokens: %v, tokens: %v", tokensNum, tokens)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if tokens[0] == "" {
 | 
					 | 
				
			||||||
		return fmt.Errorf("stat name shouldn't be empty")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// validateStatProperty validates that key and value are divided by separator and aren't empty
 | 
					 | 
				
			||||||
func validateStatProperty(key, value, sep string) error {
 | 
					 | 
				
			||||||
	if key == "" {
 | 
					 | 
				
			||||||
		return fmt.Errorf("key shouldn't be empty")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if sep != ":" {
 | 
					 | 
				
			||||||
		return fmt.Errorf("separator should be :")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if value == "" {
 | 
					 | 
				
			||||||
		return fmt.Errorf("value shouldn't be empty")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,208 +0,0 @@
 | 
				
			|||||||
//go:build rocksdb
 | 
					 | 
				
			||||||
// +build rocksdb
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package opendb
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"testing"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"github.com/stretchr/testify/require"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func TestParseSerializedStats(t *testing.T) {
 | 
					 | 
				
			||||||
	defaultSerializedStats := `rocksdb.block.cache.miss COUNT : 1
 | 
					 | 
				
			||||||
rocksdb.block.cache.hit COUNT : 2
 | 
					 | 
				
			||||||
rocksdb.block.cache.add COUNT : 3
 | 
					 | 
				
			||||||
rocksdb.block.cache.add.failures COUNT : 4
 | 
					 | 
				
			||||||
rocksdb.compaction.times.micros P50 : 1 P95 : 2 P99 : 3 P100 : 4 COUNT : 5 SUM : 6
 | 
					 | 
				
			||||||
rocksdb.compaction.times.cpu_micros P50 : 7 P95 : 8 P99 : 9 P100 : 10 COUNT : 11 SUM : 12
 | 
					 | 
				
			||||||
`
 | 
					 | 
				
			||||||
	defaultExpectedStatMap := map[string]*stat{
 | 
					 | 
				
			||||||
		"rocksdb.block.cache.miss": {
 | 
					 | 
				
			||||||
			name: "rocksdb.block.cache.miss",
 | 
					 | 
				
			||||||
			props: map[string]string{
 | 
					 | 
				
			||||||
				"COUNT": "1",
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		"rocksdb.block.cache.hit": {
 | 
					 | 
				
			||||||
			name: "rocksdb.block.cache.hit",
 | 
					 | 
				
			||||||
			props: map[string]string{
 | 
					 | 
				
			||||||
				"COUNT": "2",
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		"rocksdb.block.cache.add": {
 | 
					 | 
				
			||||||
			name: "rocksdb.block.cache.add",
 | 
					 | 
				
			||||||
			props: map[string]string{
 | 
					 | 
				
			||||||
				"COUNT": "3",
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		"rocksdb.block.cache.add.failures": {
 | 
					 | 
				
			||||||
			name: "rocksdb.block.cache.add.failures",
 | 
					 | 
				
			||||||
			props: map[string]string{
 | 
					 | 
				
			||||||
				"COUNT": "4",
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		"rocksdb.compaction.times.micros": {
 | 
					 | 
				
			||||||
			name: "rocksdb.compaction.times.micros",
 | 
					 | 
				
			||||||
			props: map[string]string{
 | 
					 | 
				
			||||||
				"P50":   "1",
 | 
					 | 
				
			||||||
				"P95":   "2",
 | 
					 | 
				
			||||||
				"P99":   "3",
 | 
					 | 
				
			||||||
				"P100":  "4",
 | 
					 | 
				
			||||||
				"COUNT": "5",
 | 
					 | 
				
			||||||
				"SUM":   "6",
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		"rocksdb.compaction.times.cpu_micros": {
 | 
					 | 
				
			||||||
			name: "rocksdb.compaction.times.cpu_micros",
 | 
					 | 
				
			||||||
			props: map[string]string{
 | 
					 | 
				
			||||||
				"P50":   "7",
 | 
					 | 
				
			||||||
				"P95":   "8",
 | 
					 | 
				
			||||||
				"P99":   "9",
 | 
					 | 
				
			||||||
				"P100":  "10",
 | 
					 | 
				
			||||||
				"COUNT": "11",
 | 
					 | 
				
			||||||
				"SUM":   "12",
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for _, tc := range []struct {
 | 
					 | 
				
			||||||
		desc            string
 | 
					 | 
				
			||||||
		serializedStats string
 | 
					 | 
				
			||||||
		expectedStatMap map[string]*stat
 | 
					 | 
				
			||||||
		errMsg          string
 | 
					 | 
				
			||||||
	}{
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			desc:            "success case",
 | 
					 | 
				
			||||||
			serializedStats: defaultSerializedStats,
 | 
					 | 
				
			||||||
			expectedStatMap: defaultExpectedStatMap,
 | 
					 | 
				
			||||||
			errMsg:          "",
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			desc: "missing value #1",
 | 
					 | 
				
			||||||
			serializedStats: `rocksdb.block.cache.miss COUNT :
 | 
					 | 
				
			||||||
`,
 | 
					 | 
				
			||||||
			expectedStatMap: nil,
 | 
					 | 
				
			||||||
			errMsg:          "invalid number of tokens",
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			desc: "missing value #2",
 | 
					 | 
				
			||||||
			serializedStats: `rocksdb.compaction.times.micros P50 : 1 P95 :
 | 
					 | 
				
			||||||
`,
 | 
					 | 
				
			||||||
			expectedStatMap: nil,
 | 
					 | 
				
			||||||
			errMsg:          "invalid number of tokens",
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			desc: "missing stat name",
 | 
					 | 
				
			||||||
			serializedStats: ` COUNT : 1
 | 
					 | 
				
			||||||
`,
 | 
					 | 
				
			||||||
			expectedStatMap: nil,
 | 
					 | 
				
			||||||
			errMsg:          "stat name shouldn't be empty",
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			desc:            "empty stat",
 | 
					 | 
				
			||||||
			serializedStats: ``,
 | 
					 | 
				
			||||||
			expectedStatMap: make(map[string]*stat),
 | 
					 | 
				
			||||||
			errMsg:          "",
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	} {
 | 
					 | 
				
			||||||
		t.Run(tc.desc, func(t *testing.T) {
 | 
					 | 
				
			||||||
			actualStatMap, err := parseSerializedStats(tc.serializedStats)
 | 
					 | 
				
			||||||
			if tc.errMsg == "" {
 | 
					 | 
				
			||||||
				require.NoError(t, err)
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				require.Error(t, err)
 | 
					 | 
				
			||||||
				require.Contains(t, err.Error(), tc.errMsg)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			require.Equal(t, tc.expectedStatMap, actualStatMap)
 | 
					 | 
				
			||||||
		})
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func TestValidateTokens(t *testing.T) {
 | 
					 | 
				
			||||||
	for _, tc := range []struct {
 | 
					 | 
				
			||||||
		desc   string
 | 
					 | 
				
			||||||
		tokens []string
 | 
					 | 
				
			||||||
		errMsg string
 | 
					 | 
				
			||||||
	}{
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			desc:   "success case",
 | 
					 | 
				
			||||||
			tokens: []string{"name", "key", ":", "value"},
 | 
					 | 
				
			||||||
			errMsg: "",
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			desc:   "missing value #1",
 | 
					 | 
				
			||||||
			tokens: []string{"name", "key", ":"},
 | 
					 | 
				
			||||||
			errMsg: "invalid number of tokens",
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			desc:   "missing value #2",
 | 
					 | 
				
			||||||
			tokens: []string{"name", "key", ":", "value", "key2", ":"},
 | 
					 | 
				
			||||||
			errMsg: "invalid number of tokens",
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			desc:   "empty stat name",
 | 
					 | 
				
			||||||
			tokens: []string{"", "key", ":", "value"},
 | 
					 | 
				
			||||||
			errMsg: "stat name shouldn't be empty",
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	} {
 | 
					 | 
				
			||||||
		t.Run(tc.desc, func(t *testing.T) {
 | 
					 | 
				
			||||||
			err := validateTokens(tc.tokens)
 | 
					 | 
				
			||||||
			if tc.errMsg == "" {
 | 
					 | 
				
			||||||
				require.NoError(t, err)
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				require.Error(t, err)
 | 
					 | 
				
			||||||
				require.Contains(t, err.Error(), tc.errMsg)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		})
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func TestValidateStatProperty(t *testing.T) {
 | 
					 | 
				
			||||||
	for _, tc := range []struct {
 | 
					 | 
				
			||||||
		desc   string
 | 
					 | 
				
			||||||
		key    string
 | 
					 | 
				
			||||||
		value  string
 | 
					 | 
				
			||||||
		sep    string
 | 
					 | 
				
			||||||
		errMsg string
 | 
					 | 
				
			||||||
	}{
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			desc:   "success case",
 | 
					 | 
				
			||||||
			key:    "key",
 | 
					 | 
				
			||||||
			value:  "value",
 | 
					 | 
				
			||||||
			sep:    ":",
 | 
					 | 
				
			||||||
			errMsg: "",
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			desc:   "missing key",
 | 
					 | 
				
			||||||
			key:    "",
 | 
					 | 
				
			||||||
			value:  "value",
 | 
					 | 
				
			||||||
			sep:    ":",
 | 
					 | 
				
			||||||
			errMsg: "key shouldn't be empty",
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			desc:   "missing value",
 | 
					 | 
				
			||||||
			key:    "key",
 | 
					 | 
				
			||||||
			value:  "",
 | 
					 | 
				
			||||||
			sep:    ":",
 | 
					 | 
				
			||||||
			errMsg: "value shouldn't be empty",
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			desc:   "invalid separator",
 | 
					 | 
				
			||||||
			key:    "key",
 | 
					 | 
				
			||||||
			value:  "value",
 | 
					 | 
				
			||||||
			sep:    "#",
 | 
					 | 
				
			||||||
			errMsg: "separator should be :",
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	} {
 | 
					 | 
				
			||||||
		t.Run(tc.desc, func(t *testing.T) {
 | 
					 | 
				
			||||||
			err := validateStatProperty(tc.key, tc.value, tc.sep)
 | 
					 | 
				
			||||||
			if tc.errMsg == "" {
 | 
					 | 
				
			||||||
				require.NoError(t, err)
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				require.Error(t, err)
 | 
					 | 
				
			||||||
				require.Contains(t, err.Error(), tc.errMsg)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		})
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,284 +0,0 @@
 | 
				
			|||||||
//go:build rocksdb
 | 
					 | 
				
			||||||
// +build rocksdb
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package opendb
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"strconv"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const (
 | 
					 | 
				
			||||||
	sum   = "SUM"
 | 
					 | 
				
			||||||
	count = "COUNT"
 | 
					 | 
				
			||||||
	p50   = "P50"
 | 
					 | 
				
			||||||
	p95   = "P95"
 | 
					 | 
				
			||||||
	p99   = "P99"
 | 
					 | 
				
			||||||
	p100  = "P100"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type statLoader struct {
 | 
					 | 
				
			||||||
	// statMap contains map of stat objects returned by parseSerializedStats function
 | 
					 | 
				
			||||||
	// example of stats:
 | 
					 | 
				
			||||||
	// #1: rocksdb.block.cache.miss COUNT : 5
 | 
					 | 
				
			||||||
	// #2: rocksdb.compaction.times.micros P50 : 21112 P95 : 21112 P99 : 21112 P100 : 21112 COUNT : 1 SUM : 21112
 | 
					 | 
				
			||||||
	// #1 case will be cast into int64
 | 
					 | 
				
			||||||
	// #2 case will be cast into float64Histogram
 | 
					 | 
				
			||||||
	statMap map[string]*stat
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// NOTE: some methods accumulate errors instead of returning them, these methods are private and not intended to use outside
 | 
					 | 
				
			||||||
	errors []error
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func newStatLoader(statMap map[string]*stat) *statLoader {
 | 
					 | 
				
			||||||
	return &statLoader{
 | 
					 | 
				
			||||||
		statMap: statMap,
 | 
					 | 
				
			||||||
		errors:  make([]error, 0),
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type stats struct {
 | 
					 | 
				
			||||||
	NumberKeysWritten int64
 | 
					 | 
				
			||||||
	NumberKeysRead    int64
 | 
					 | 
				
			||||||
	NumberKeysUpdated int64
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// total block cache misses
 | 
					 | 
				
			||||||
	// BLOCK_CACHE_MISS == BLOCK_CACHE_INDEX_MISS +
 | 
					 | 
				
			||||||
	//                     BLOCK_CACHE_FILTER_MISS +
 | 
					 | 
				
			||||||
	//                     BLOCK_CACHE_DATA_MISS;
 | 
					 | 
				
			||||||
	// BLOCK_CACHE_INDEX_MISS: # of times cache miss when accessing index block from block cache.
 | 
					 | 
				
			||||||
	// BLOCK_CACHE_FILTER_MISS: # of times cache miss when accessing filter block from block cache.
 | 
					 | 
				
			||||||
	// BLOCK_CACHE_DATA_MISS: # of times cache miss when accessing data block from block cache.
 | 
					 | 
				
			||||||
	BlockCacheMiss int64
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// total block cache hit
 | 
					 | 
				
			||||||
	// BLOCK_CACHE_HIT == BLOCK_CACHE_INDEX_HIT +
 | 
					 | 
				
			||||||
	//                    BLOCK_CACHE_FILTER_HIT +
 | 
					 | 
				
			||||||
	//                    BLOCK_CACHE_DATA_HIT;
 | 
					 | 
				
			||||||
	// BLOCK_CACHE_INDEX_HIT: # of times cache hit when accessing index block from block cache.
 | 
					 | 
				
			||||||
	// BLOCK_CACHE_FILTER_HIT: # of times cache hit when accessing filter block from block cache.
 | 
					 | 
				
			||||||
	// BLOCK_CACHE_DATA_HIT: # of times cache hit when accessing data block from block cache.
 | 
					 | 
				
			||||||
	BlockCacheHit int64
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// # of blocks added to block cache.
 | 
					 | 
				
			||||||
	BlockCacheAdd int64
 | 
					 | 
				
			||||||
	// # of failures when adding blocks to block cache.
 | 
					 | 
				
			||||||
	BlockCacheAddFailures int64
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	BlockCacheIndexMiss         int64
 | 
					 | 
				
			||||||
	BlockCacheIndexHit          int64
 | 
					 | 
				
			||||||
	BlockCacheIndexBytesInsert  int64
 | 
					 | 
				
			||||||
	BlockCacheFilterMiss        int64
 | 
					 | 
				
			||||||
	BlockCacheFilterHit         int64
 | 
					 | 
				
			||||||
	BlockCacheFilterBytesInsert int64
 | 
					 | 
				
			||||||
	BlockCacheDataMiss          int64
 | 
					 | 
				
			||||||
	BlockCacheDataHit           int64
 | 
					 | 
				
			||||||
	BlockCacheDataBytesInsert   int64
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	CompactReadBytes  int64 // Bytes read during compaction
 | 
					 | 
				
			||||||
	CompactWriteBytes int64 // Bytes written during compaction
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	CompactionTimesMicros      *float64Histogram
 | 
					 | 
				
			||||||
	CompactionTimesCPUMicros   *float64Histogram
 | 
					 | 
				
			||||||
	NumFilesInSingleCompaction *float64Histogram
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Read amplification statistics.
 | 
					 | 
				
			||||||
	// Read amplification can be calculated using this formula
 | 
					 | 
				
			||||||
	// (READ_AMP_TOTAL_READ_BYTES / READ_AMP_ESTIMATE_USEFUL_BYTES)
 | 
					 | 
				
			||||||
	//
 | 
					 | 
				
			||||||
	// REQUIRES: ReadOptions::read_amp_bytes_per_bit to be enabled
 | 
					 | 
				
			||||||
	// TODO(yevhenii): seems not working?
 | 
					 | 
				
			||||||
	ReadAmpEstimateUsefulBytes int64 // Estimate of total bytes actually used.
 | 
					 | 
				
			||||||
	ReadAmpTotalReadBytes      int64 // Total size of loaded data blocks.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	NumberFileOpens  int64
 | 
					 | 
				
			||||||
	NumberFileErrors int64
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// # of times bloom filter has avoided file reads, i.e., negatives.
 | 
					 | 
				
			||||||
	BloomFilterUseful int64
 | 
					 | 
				
			||||||
	// # of times bloom FullFilter has not avoided the reads.
 | 
					 | 
				
			||||||
	BloomFilterFullPositive int64
 | 
					 | 
				
			||||||
	// # of times bloom FullFilter has not avoided the reads and data actually
 | 
					 | 
				
			||||||
	// exist.
 | 
					 | 
				
			||||||
	BloomFilterFullTruePositive int64
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// # of memtable hits.
 | 
					 | 
				
			||||||
	MemtableHit int64
 | 
					 | 
				
			||||||
	// # of memtable misses.
 | 
					 | 
				
			||||||
	MemtableMiss int64
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// # of Get() queries served by L0
 | 
					 | 
				
			||||||
	GetHitL0 int64
 | 
					 | 
				
			||||||
	// # of Get() queries served by L1
 | 
					 | 
				
			||||||
	GetHitL1 int64
 | 
					 | 
				
			||||||
	// # of Get() queries served by L2 and up
 | 
					 | 
				
			||||||
	GetHitL2AndUp int64
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// The number of uncompressed bytes issued by DB::Put(), DB::Delete(),
 | 
					 | 
				
			||||||
	// DB::Merge(), and DB::Write().
 | 
					 | 
				
			||||||
	BytesWritten int64
 | 
					 | 
				
			||||||
	// The number of uncompressed bytes read from DB::Get().  It could be
 | 
					 | 
				
			||||||
	// either from memtables, cache, or table files.
 | 
					 | 
				
			||||||
	// For the number of logical bytes read from DB::MultiGet(),
 | 
					 | 
				
			||||||
	// please use NUMBER_MULTIGET_BYTES_READ.
 | 
					 | 
				
			||||||
	BytesRead int64
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Writer has to wait for compaction or flush to finish.
 | 
					 | 
				
			||||||
	StallMicros           int64
 | 
					 | 
				
			||||||
	DBWriteStallHistogram *float64Histogram
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Last level and non-last level read statistics
 | 
					 | 
				
			||||||
	LastLevelReadBytes    int64
 | 
					 | 
				
			||||||
	LastLevelReadCount    int64
 | 
					 | 
				
			||||||
	NonLastLevelReadBytes int64
 | 
					 | 
				
			||||||
	NonLastLevelReadCount int64
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	DBGetMicros   *float64Histogram
 | 
					 | 
				
			||||||
	DBWriteMicros *float64Histogram
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Value size distribution in each operation
 | 
					 | 
				
			||||||
	BytesPerRead     *float64Histogram
 | 
					 | 
				
			||||||
	BytesPerWrite    *float64Histogram
 | 
					 | 
				
			||||||
	BytesPerMultiget *float64Histogram
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Time spent flushing memtable to disk
 | 
					 | 
				
			||||||
	FlushMicros *float64Histogram
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type float64Histogram struct {
 | 
					 | 
				
			||||||
	Sum   float64
 | 
					 | 
				
			||||||
	Count float64
 | 
					 | 
				
			||||||
	P50   float64
 | 
					 | 
				
			||||||
	P95   float64
 | 
					 | 
				
			||||||
	P99   float64
 | 
					 | 
				
			||||||
	P100  float64
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (l *statLoader) error() error {
 | 
					 | 
				
			||||||
	if len(l.errors) != 0 {
 | 
					 | 
				
			||||||
		return fmt.Errorf("%v", l.errors)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (l *statLoader) load() (*stats, error) {
 | 
					 | 
				
			||||||
	stats := &stats{
 | 
					 | 
				
			||||||
		NumberKeysWritten:           l.getInt64StatValue("rocksdb.number.keys.written", count),
 | 
					 | 
				
			||||||
		NumberKeysRead:              l.getInt64StatValue("rocksdb.number.keys.read", count),
 | 
					 | 
				
			||||||
		NumberKeysUpdated:           l.getInt64StatValue("rocksdb.number.keys.updated", count),
 | 
					 | 
				
			||||||
		BlockCacheMiss:              l.getInt64StatValue("rocksdb.block.cache.miss", count),
 | 
					 | 
				
			||||||
		BlockCacheHit:               l.getInt64StatValue("rocksdb.block.cache.hit", count),
 | 
					 | 
				
			||||||
		BlockCacheAdd:               l.getInt64StatValue("rocksdb.block.cache.add", count),
 | 
					 | 
				
			||||||
		BlockCacheAddFailures:       l.getInt64StatValue("rocksdb.block.cache.add.failures", count),
 | 
					 | 
				
			||||||
		BlockCacheIndexMiss:         l.getInt64StatValue("rocksdb.block.cache.index.miss", count),
 | 
					 | 
				
			||||||
		BlockCacheIndexHit:          l.getInt64StatValue("rocksdb.block.cache.index.hit", count),
 | 
					 | 
				
			||||||
		BlockCacheIndexBytesInsert:  l.getInt64StatValue("rocksdb.block.cache.index.bytes.insert", count),
 | 
					 | 
				
			||||||
		BlockCacheFilterMiss:        l.getInt64StatValue("rocksdb.block.cache.filter.miss", count),
 | 
					 | 
				
			||||||
		BlockCacheFilterHit:         l.getInt64StatValue("rocksdb.block.cache.filter.hit", count),
 | 
					 | 
				
			||||||
		BlockCacheFilterBytesInsert: l.getInt64StatValue("rocksdb.block.cache.filter.bytes.insert", count),
 | 
					 | 
				
			||||||
		BlockCacheDataMiss:          l.getInt64StatValue("rocksdb.block.cache.data.miss", count),
 | 
					 | 
				
			||||||
		BlockCacheDataHit:           l.getInt64StatValue("rocksdb.block.cache.data.hit", count),
 | 
					 | 
				
			||||||
		BlockCacheDataBytesInsert:   l.getInt64StatValue("rocksdb.block.cache.data.bytes.insert", count),
 | 
					 | 
				
			||||||
		CompactReadBytes:            l.getInt64StatValue("rocksdb.compact.read.bytes", count),
 | 
					 | 
				
			||||||
		CompactWriteBytes:           l.getInt64StatValue("rocksdb.compact.write.bytes", count),
 | 
					 | 
				
			||||||
		CompactionTimesMicros:       l.getFloat64HistogramStatValue("rocksdb.compaction.times.micros"),
 | 
					 | 
				
			||||||
		CompactionTimesCPUMicros:    l.getFloat64HistogramStatValue("rocksdb.compaction.times.cpu_micros"),
 | 
					 | 
				
			||||||
		NumFilesInSingleCompaction:  l.getFloat64HistogramStatValue("rocksdb.numfiles.in.singlecompaction"),
 | 
					 | 
				
			||||||
		ReadAmpEstimateUsefulBytes:  l.getInt64StatValue("rocksdb.read.amp.estimate.useful.bytes", count),
 | 
					 | 
				
			||||||
		ReadAmpTotalReadBytes:       l.getInt64StatValue("rocksdb.read.amp.total.read.bytes", count),
 | 
					 | 
				
			||||||
		NumberFileOpens:             l.getInt64StatValue("rocksdb.no.file.opens", count),
 | 
					 | 
				
			||||||
		NumberFileErrors:            l.getInt64StatValue("rocksdb.no.file.errors", count),
 | 
					 | 
				
			||||||
		BloomFilterUseful:           l.getInt64StatValue("rocksdb.bloom.filter.useful", count),
 | 
					 | 
				
			||||||
		BloomFilterFullPositive:     l.getInt64StatValue("rocksdb.bloom.filter.full.positive", count),
 | 
					 | 
				
			||||||
		BloomFilterFullTruePositive: l.getInt64StatValue("rocksdb.bloom.filter.full.true.positive", count),
 | 
					 | 
				
			||||||
		MemtableHit:                 l.getInt64StatValue("rocksdb.memtable.hit", count),
 | 
					 | 
				
			||||||
		MemtableMiss:                l.getInt64StatValue("rocksdb.memtable.miss", count),
 | 
					 | 
				
			||||||
		GetHitL0:                    l.getInt64StatValue("rocksdb.l0.hit", count),
 | 
					 | 
				
			||||||
		GetHitL1:                    l.getInt64StatValue("rocksdb.l1.hit", count),
 | 
					 | 
				
			||||||
		GetHitL2AndUp:               l.getInt64StatValue("rocksdb.l2andup.hit", count),
 | 
					 | 
				
			||||||
		BytesWritten:                l.getInt64StatValue("rocksdb.bytes.written", count),
 | 
					 | 
				
			||||||
		BytesRead:                   l.getInt64StatValue("rocksdb.bytes.read", count),
 | 
					 | 
				
			||||||
		StallMicros:                 l.getInt64StatValue("rocksdb.stall.micros", count),
 | 
					 | 
				
			||||||
		DBWriteStallHistogram:       l.getFloat64HistogramStatValue("rocksdb.db.write.stall"),
 | 
					 | 
				
			||||||
		LastLevelReadBytes:          l.getInt64StatValue("rocksdb.last.level.read.bytes", count),
 | 
					 | 
				
			||||||
		LastLevelReadCount:          l.getInt64StatValue("rocksdb.last.level.read.count", count),
 | 
					 | 
				
			||||||
		NonLastLevelReadBytes:       l.getInt64StatValue("rocksdb.non.last.level.read.bytes", count),
 | 
					 | 
				
			||||||
		NonLastLevelReadCount:       l.getInt64StatValue("rocksdb.non.last.level.read.count", count),
 | 
					 | 
				
			||||||
		DBGetMicros:                 l.getFloat64HistogramStatValue("rocksdb.db.get.micros"),
 | 
					 | 
				
			||||||
		DBWriteMicros:               l.getFloat64HistogramStatValue("rocksdb.db.write.micros"),
 | 
					 | 
				
			||||||
		BytesPerRead:                l.getFloat64HistogramStatValue("rocksdb.bytes.per.read"),
 | 
					 | 
				
			||||||
		BytesPerWrite:               l.getFloat64HistogramStatValue("rocksdb.bytes.per.write"),
 | 
					 | 
				
			||||||
		BytesPerMultiget:            l.getFloat64HistogramStatValue("rocksdb.bytes.per.multiget"),
 | 
					 | 
				
			||||||
		FlushMicros:                 l.getFloat64HistogramStatValue("rocksdb.db.flush.micros"),
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	err := l.error()
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return stats, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// getFloat64HistogramStatValue converts stat object into float64Histogram
 | 
					 | 
				
			||||||
func (l *statLoader) getFloat64HistogramStatValue(statName string) *float64Histogram {
 | 
					 | 
				
			||||||
	return &float64Histogram{
 | 
					 | 
				
			||||||
		Sum:   l.getFloat64StatValue(statName, sum),
 | 
					 | 
				
			||||||
		Count: l.getFloat64StatValue(statName, count),
 | 
					 | 
				
			||||||
		P50:   l.getFloat64StatValue(statName, p50),
 | 
					 | 
				
			||||||
		P95:   l.getFloat64StatValue(statName, p95),
 | 
					 | 
				
			||||||
		P99:   l.getFloat64StatValue(statName, p99),
 | 
					 | 
				
			||||||
		P100:  l.getFloat64StatValue(statName, p100),
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// getInt64StatValue converts property of stat object into int64
 | 
					 | 
				
			||||||
func (l *statLoader) getInt64StatValue(statName, propName string) int64 {
 | 
					 | 
				
			||||||
	stringVal := l.getStatValue(statName, propName)
 | 
					 | 
				
			||||||
	if stringVal == "" {
 | 
					 | 
				
			||||||
		l.errors = append(l.errors, fmt.Errorf("can't get stat by name: %v", statName))
 | 
					 | 
				
			||||||
		return 0
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	intVal, err := strconv.ParseInt(stringVal, 10, 64)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		l.errors = append(l.errors, fmt.Errorf("can't parse int: %v", err))
 | 
					 | 
				
			||||||
		return 0
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return intVal
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// getFloat64StatValue converts property of stat object into float64
 | 
					 | 
				
			||||||
func (l *statLoader) getFloat64StatValue(statName, propName string) float64 {
 | 
					 | 
				
			||||||
	stringVal := l.getStatValue(statName, propName)
 | 
					 | 
				
			||||||
	if stringVal == "" {
 | 
					 | 
				
			||||||
		l.errors = append(l.errors, fmt.Errorf("can't get stat by name: %v", statName))
 | 
					 | 
				
			||||||
		return 0
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	floatVal, err := strconv.ParseFloat(stringVal, 64)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		l.errors = append(l.errors, fmt.Errorf("can't parse float: %v", err))
 | 
					 | 
				
			||||||
		return 0
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return floatVal
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// getStatValue gets property of stat object
 | 
					 | 
				
			||||||
func (l *statLoader) getStatValue(statName, propName string) string {
 | 
					 | 
				
			||||||
	stat, ok := l.statMap[statName]
 | 
					 | 
				
			||||||
	if !ok {
 | 
					 | 
				
			||||||
		l.errors = append(l.errors, fmt.Errorf("stat %v doesn't exist", statName))
 | 
					 | 
				
			||||||
		return ""
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	prop, ok := stat.props[propName]
 | 
					 | 
				
			||||||
	if !ok {
 | 
					 | 
				
			||||||
		l.errors = append(l.errors, fmt.Errorf("stat %v doesn't have %v property", statName, propName))
 | 
					 | 
				
			||||||
		return ""
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return prop
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,90 +0,0 @@
 | 
				
			|||||||
//go:build rocksdb
 | 
					 | 
				
			||||||
// +build rocksdb
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package opendb
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"testing"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"github.com/stretchr/testify/require"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func TestStatsLoader(t *testing.T) {
 | 
					 | 
				
			||||||
	defaultStat := stat{
 | 
					 | 
				
			||||||
		props: map[string]string{
 | 
					 | 
				
			||||||
			"COUNT": "1",
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	defaultHistogramStat := stat{
 | 
					 | 
				
			||||||
		props: map[string]string{
 | 
					 | 
				
			||||||
			"P50":   "1",
 | 
					 | 
				
			||||||
			"P95":   "2",
 | 
					 | 
				
			||||||
			"P99":   "3",
 | 
					 | 
				
			||||||
			"P100":  "4",
 | 
					 | 
				
			||||||
			"COUNT": "5",
 | 
					 | 
				
			||||||
			"SUM":   "6",
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	defaultStatMap := map[string]*stat{
 | 
					 | 
				
			||||||
		"rocksdb.number.keys.written":             &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.number.keys.read":                &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.number.keys.updated":             &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.block.cache.miss":                &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.block.cache.hit":                 &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.block.cache.add":                 &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.block.cache.add.failures":        &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.block.cache.index.miss":          &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.block.cache.index.hit":           &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.block.cache.index.bytes.insert":  &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.block.cache.filter.miss":         &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.block.cache.filter.hit":          &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.block.cache.filter.bytes.insert": &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.block.cache.data.miss":           &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.block.cache.data.hit":            &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.block.cache.data.bytes.insert":   &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.compact.read.bytes":              &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.compact.write.bytes":             &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.compaction.times.micros":         &defaultHistogramStat,
 | 
					 | 
				
			||||||
		"rocksdb.compaction.times.cpu_micros":     &defaultHistogramStat,
 | 
					 | 
				
			||||||
		"rocksdb.numfiles.in.singlecompaction":    &defaultHistogramStat,
 | 
					 | 
				
			||||||
		"rocksdb.read.amp.estimate.useful.bytes":  &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.read.amp.total.read.bytes":       &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.no.file.opens":                   &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.no.file.errors":                  &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.bloom.filter.useful":             &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.bloom.filter.full.positive":      &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.bloom.filter.full.true.positive": &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.memtable.hit":                    &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.memtable.miss":                   &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.l0.hit":                          &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.l1.hit":                          &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.l2andup.hit":                     &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.bytes.written":                   &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.bytes.read":                      &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.stall.micros":                    &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.db.write.stall":                  &defaultHistogramStat,
 | 
					 | 
				
			||||||
		"rocksdb.last.level.read.bytes":           &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.last.level.read.count":           &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.non.last.level.read.bytes":       &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.non.last.level.read.count":       &defaultStat,
 | 
					 | 
				
			||||||
		"rocksdb.db.get.micros":                   &defaultHistogramStat,
 | 
					 | 
				
			||||||
		"rocksdb.db.write.micros":                 &defaultHistogramStat,
 | 
					 | 
				
			||||||
		"rocksdb.bytes.per.read":                  &defaultHistogramStat,
 | 
					 | 
				
			||||||
		"rocksdb.bytes.per.write":                 &defaultHistogramStat,
 | 
					 | 
				
			||||||
		"rocksdb.bytes.per.multiget":              &defaultHistogramStat,
 | 
					 | 
				
			||||||
		"rocksdb.db.flush.micros":                 &defaultHistogramStat,
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	statLoader := newStatLoader(defaultStatMap)
 | 
					 | 
				
			||||||
	stats, err := statLoader.load()
 | 
					 | 
				
			||||||
	require.NoError(t, err)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	require.Equal(t, stats.NumberKeysWritten, int64(1))
 | 
					 | 
				
			||||||
	require.Equal(t, stats.NumberKeysRead, int64(1))
 | 
					 | 
				
			||||||
	require.Equal(t, stats.CompactionTimesMicros.P50, float64(1))
 | 
					 | 
				
			||||||
	require.Equal(t, stats.CompactionTimesMicros.P95, float64(2))
 | 
					 | 
				
			||||||
	require.Equal(t, stats.CompactionTimesMicros.P99, float64(3))
 | 
					 | 
				
			||||||
	require.Equal(t, stats.CompactionTimesMicros.P100, float64(4))
 | 
					 | 
				
			||||||
	require.Equal(t, stats.CompactionTimesMicros.Count, float64(5))
 | 
					 | 
				
			||||||
	require.Equal(t, stats.CompactionTimesMicros.Sum, float64(6))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										108
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										108
									
								
								go.mod
									
									
									
									
									
								
							@ -7,11 +7,12 @@ require (
 | 
				
			|||||||
	cosmossdk.io/log v1.3.1
 | 
						cosmossdk.io/log v1.3.1
 | 
				
			||||||
	cosmossdk.io/math v1.3.0
 | 
						cosmossdk.io/math v1.3.0
 | 
				
			||||||
	cosmossdk.io/simapp v0.0.0-20231127212628-044ff4d8c015
 | 
						cosmossdk.io/simapp v0.0.0-20231127212628-044ff4d8c015
 | 
				
			||||||
 | 
						github.com/Kava-Labs/opendb v0.0.0-20240703151529-8197d03e2a25
 | 
				
			||||||
	github.com/cenkalti/backoff/v4 v4.1.3
 | 
						github.com/cenkalti/backoff/v4 v4.1.3
 | 
				
			||||||
	github.com/cometbft/cometbft v0.37.4
 | 
						github.com/cometbft/cometbft v0.37.4
 | 
				
			||||||
	github.com/cometbft/cometbft-db v0.9.1
 | 
						github.com/cometbft/cometbft-db v0.9.1
 | 
				
			||||||
	github.com/cosmos/cosmos-db v1.0.0
 | 
						github.com/cosmos/cosmos-db v1.0.2
 | 
				
			||||||
	github.com/cosmos/cosmos-proto v1.0.0-beta.4
 | 
						github.com/cosmos/cosmos-proto v1.0.0-beta.5
 | 
				
			||||||
	github.com/cosmos/cosmos-sdk v0.47.10
 | 
						github.com/cosmos/cosmos-sdk v0.47.10
 | 
				
			||||||
	github.com/cosmos/go-bip39 v1.0.0
 | 
						github.com/cosmos/go-bip39 v1.0.0
 | 
				
			||||||
	github.com/cosmos/gogoproto v1.4.10
 | 
						github.com/cosmos/gogoproto v1.4.10
 | 
				
			||||||
@ -20,33 +21,33 @@ require (
 | 
				
			|||||||
	github.com/cosmos/ibc-go/v7 v7.4.0
 | 
						github.com/cosmos/ibc-go/v7 v7.4.0
 | 
				
			||||||
	github.com/ethereum/go-ethereum v1.10.26
 | 
						github.com/ethereum/go-ethereum v1.10.26
 | 
				
			||||||
	github.com/evmos/ethermint v0.21.0
 | 
						github.com/evmos/ethermint v0.21.0
 | 
				
			||||||
	github.com/go-kit/kit v0.12.0
 | 
						github.com/go-kit/kit v0.13.0
 | 
				
			||||||
	github.com/gogo/protobuf v1.3.2
 | 
						github.com/gogo/protobuf v1.3.2
 | 
				
			||||||
	github.com/golang/protobuf v1.5.3
 | 
						github.com/golang/protobuf v1.5.4
 | 
				
			||||||
	github.com/gorilla/mux v1.8.0
 | 
						github.com/gorilla/mux v1.8.0
 | 
				
			||||||
	github.com/grpc-ecosystem/grpc-gateway v1.16.0
 | 
						github.com/grpc-ecosystem/grpc-gateway v1.16.0
 | 
				
			||||||
	github.com/linxGnu/grocksdb v1.8.13
 | 
						github.com/linxGnu/grocksdb v1.8.13
 | 
				
			||||||
	github.com/pelletier/go-toml/v2 v2.0.8
 | 
						github.com/pelletier/go-toml/v2 v2.1.0
 | 
				
			||||||
	github.com/prometheus/client_golang v1.14.0
 | 
						github.com/prometheus/client_golang v1.14.0
 | 
				
			||||||
	github.com/spf13/cast v1.5.1
 | 
						github.com/spf13/cast v1.6.0
 | 
				
			||||||
	github.com/spf13/cobra v1.7.0
 | 
						github.com/spf13/cobra v1.8.0
 | 
				
			||||||
	github.com/spf13/viper v1.16.0
 | 
						github.com/spf13/viper v1.16.0
 | 
				
			||||||
	github.com/stretchr/testify v1.9.0
 | 
						github.com/stretchr/testify v1.9.0
 | 
				
			||||||
	github.com/subosito/gotenv v1.4.2
 | 
						github.com/subosito/gotenv v1.6.0
 | 
				
			||||||
	golang.org/x/crypto v0.16.0
 | 
						golang.org/x/crypto v0.22.0
 | 
				
			||||||
	golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb
 | 
						golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb
 | 
				
			||||||
	google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0
 | 
						google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de
 | 
				
			||||||
	google.golang.org/grpc v1.60.1
 | 
						google.golang.org/grpc v1.63.2
 | 
				
			||||||
	google.golang.org/protobuf v1.32.0
 | 
						google.golang.org/protobuf v1.33.0
 | 
				
			||||||
	sigs.k8s.io/yaml v1.4.0
 | 
						sigs.k8s.io/yaml v1.4.0
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require (
 | 
					require (
 | 
				
			||||||
	cloud.google.com/go v0.111.0 // indirect
 | 
						cloud.google.com/go v0.112.0 // indirect
 | 
				
			||||||
	cloud.google.com/go/compute v1.23.3 // indirect
 | 
						cloud.google.com/go/compute v1.24.0 // indirect
 | 
				
			||||||
	cloud.google.com/go/compute/metadata v0.2.3 // indirect
 | 
						cloud.google.com/go/compute/metadata v0.2.3 // indirect
 | 
				
			||||||
	cloud.google.com/go/iam v1.1.5 // indirect
 | 
						cloud.google.com/go/iam v1.1.6 // indirect
 | 
				
			||||||
	cloud.google.com/go/storage v1.30.1 // indirect
 | 
						cloud.google.com/go/storage v1.36.0 // indirect
 | 
				
			||||||
	cosmossdk.io/api v0.3.1 // indirect
 | 
						cosmossdk.io/api v0.3.1 // indirect
 | 
				
			||||||
	cosmossdk.io/core v0.6.1 // indirect
 | 
						cosmossdk.io/core v0.6.1 // indirect
 | 
				
			||||||
	cosmossdk.io/depinject v1.0.0-alpha.4 // indirect
 | 
						cosmossdk.io/depinject v1.0.0-alpha.4 // indirect
 | 
				
			||||||
@ -55,7 +56,7 @@ require (
 | 
				
			|||||||
	github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect
 | 
						github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect
 | 
				
			||||||
	github.com/99designs/keyring v1.2.1 // indirect
 | 
						github.com/99designs/keyring v1.2.1 // indirect
 | 
				
			||||||
	github.com/ChainSafe/go-schnorrkel v1.0.0 // indirect
 | 
						github.com/ChainSafe/go-schnorrkel v1.0.0 // indirect
 | 
				
			||||||
	github.com/DataDog/zstd v1.5.2 // indirect
 | 
						github.com/DataDog/zstd v1.5.5 // indirect
 | 
				
			||||||
	github.com/StackExchange/wmi v1.2.1 // indirect
 | 
						github.com/StackExchange/wmi v1.2.1 // indirect
 | 
				
			||||||
	github.com/VictoriaMetrics/fastcache v1.6.0 // indirect
 | 
						github.com/VictoriaMetrics/fastcache v1.6.0 // indirect
 | 
				
			||||||
	github.com/allegro/bigcache v1.2.1 // indirect
 | 
						github.com/allegro/bigcache v1.2.1 // indirect
 | 
				
			||||||
@ -69,25 +70,26 @@ require (
 | 
				
			|||||||
	github.com/btcsuite/btcd/btcutil v1.1.3 // indirect
 | 
						github.com/btcsuite/btcd/btcutil v1.1.3 // indirect
 | 
				
			||||||
	github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect
 | 
						github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect
 | 
				
			||||||
	github.com/cespare/xxhash v1.1.0 // indirect
 | 
						github.com/cespare/xxhash v1.1.0 // indirect
 | 
				
			||||||
	github.com/cespare/xxhash/v2 v2.2.0 // indirect
 | 
						github.com/cespare/xxhash/v2 v2.3.0 // indirect
 | 
				
			||||||
	github.com/chzyer/readline v1.5.1 // indirect
 | 
						github.com/chzyer/readline v1.5.1 // indirect
 | 
				
			||||||
	github.com/cockroachdb/apd/v2 v2.0.2 // indirect
 | 
						github.com/cockroachdb/apd/v2 v2.0.2 // indirect
 | 
				
			||||||
	github.com/cockroachdb/errors v1.10.0 // indirect
 | 
						github.com/cockroachdb/errors v1.11.1 // indirect
 | 
				
			||||||
	github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
 | 
						github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
 | 
				
			||||||
	github.com/cockroachdb/pebble v0.0.0-20230226194802-02d779ffbc46 // indirect
 | 
						github.com/cockroachdb/pebble v1.1.0 // indirect
 | 
				
			||||||
	github.com/cockroachdb/redact v1.1.5 // indirect
 | 
						github.com/cockroachdb/redact v1.1.5 // indirect
 | 
				
			||||||
 | 
						github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect
 | 
				
			||||||
	github.com/coinbase/rosetta-sdk-go v0.7.9 // indirect
 | 
						github.com/coinbase/rosetta-sdk-go v0.7.9 // indirect
 | 
				
			||||||
	github.com/confio/ics23/go v0.9.0 // indirect
 | 
						github.com/confio/ics23/go v0.9.0 // indirect
 | 
				
			||||||
	github.com/cosmos/btcutil v1.0.5 // indirect
 | 
						github.com/cosmos/btcutil v1.0.5 // indirect
 | 
				
			||||||
	github.com/cosmos/gogogateway v1.2.0 // indirect
 | 
						github.com/cosmos/gogogateway v1.2.0 // indirect
 | 
				
			||||||
	github.com/cosmos/ics23/go v0.10.0 // indirect
 | 
						github.com/cosmos/ics23/go v0.10.0 // indirect
 | 
				
			||||||
	github.com/cosmos/ledger-cosmos-go v0.13.1 // indirect
 | 
						github.com/cosmos/ledger-cosmos-go v0.13.3 // indirect
 | 
				
			||||||
	github.com/cosmos/rosetta-sdk-go v0.10.0 // indirect
 | 
						github.com/cosmos/rosetta-sdk-go v0.10.0 // indirect
 | 
				
			||||||
	github.com/creachadair/taskgroup v0.4.2 // indirect
 | 
						github.com/creachadair/taskgroup v0.4.2 // indirect
 | 
				
			||||||
	github.com/danieljoos/wincred v1.1.2 // indirect
 | 
						github.com/danieljoos/wincred v1.1.2 // indirect
 | 
				
			||||||
	github.com/davecgh/go-spew v1.1.1 // indirect
 | 
						github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
 | 
				
			||||||
	github.com/deckarep/golang-set v1.8.0 // indirect
 | 
						github.com/deckarep/golang-set v1.8.0 // indirect
 | 
				
			||||||
	github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect
 | 
						github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect
 | 
				
			||||||
	github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect
 | 
						github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect
 | 
				
			||||||
	github.com/dgraph-io/badger/v2 v2.2007.4 // indirect
 | 
						github.com/dgraph-io/badger/v2 v2.2007.4 // indirect
 | 
				
			||||||
	github.com/dgraph-io/ristretto v0.1.1 // indirect
 | 
						github.com/dgraph-io/ristretto v0.1.1 // indirect
 | 
				
			||||||
@ -97,21 +99,21 @@ require (
 | 
				
			|||||||
	github.com/dustin/go-humanize v1.0.1 // indirect
 | 
						github.com/dustin/go-humanize v1.0.1 // indirect
 | 
				
			||||||
	github.com/dvsekhvalnov/jose2go v1.6.0 // indirect
 | 
						github.com/dvsekhvalnov/jose2go v1.6.0 // indirect
 | 
				
			||||||
	github.com/edsrzf/mmap-go v1.0.0 // indirect
 | 
						github.com/edsrzf/mmap-go v1.0.0 // indirect
 | 
				
			||||||
	github.com/emicklei/dot v1.4.2 // indirect
 | 
						github.com/emicklei/dot v1.6.1 // indirect
 | 
				
			||||||
	github.com/felixge/httpsnoop v1.0.2 // indirect
 | 
						github.com/felixge/httpsnoop v1.0.4 // indirect
 | 
				
			||||||
	github.com/fsnotify/fsnotify v1.6.0 // indirect
 | 
						github.com/fsnotify/fsnotify v1.7.0 // indirect
 | 
				
			||||||
	github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff // indirect
 | 
						github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff // indirect
 | 
				
			||||||
	github.com/getsentry/sentry-go v0.23.0 // indirect
 | 
						github.com/getsentry/sentry-go v0.27.0 // indirect
 | 
				
			||||||
	github.com/go-kit/log v0.2.1 // indirect
 | 
						github.com/go-kit/log v0.2.1 // indirect
 | 
				
			||||||
	github.com/go-logfmt/logfmt v0.6.0 // indirect
 | 
						github.com/go-logfmt/logfmt v0.6.0 // indirect
 | 
				
			||||||
	github.com/go-logr/logr v1.2.4 // indirect
 | 
						github.com/go-logr/logr v1.4.1 // indirect
 | 
				
			||||||
	github.com/go-logr/stdr v1.2.2 // indirect
 | 
						github.com/go-logr/stdr v1.2.2 // indirect
 | 
				
			||||||
	github.com/go-ole/go-ole v1.2.6 // indirect
 | 
						github.com/go-ole/go-ole v1.2.6 // indirect
 | 
				
			||||||
	github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect
 | 
						github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect
 | 
				
			||||||
	github.com/go-stack/stack v1.8.1 // indirect
 | 
						github.com/go-stack/stack v1.8.1 // indirect
 | 
				
			||||||
	github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect
 | 
						github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect
 | 
				
			||||||
	github.com/gogo/googleapis v1.4.1 // indirect
 | 
						github.com/gogo/googleapis v1.4.1 // indirect
 | 
				
			||||||
	github.com/golang/glog v1.1.2 // indirect
 | 
						github.com/golang/glog v1.2.0 // indirect
 | 
				
			||||||
	github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
 | 
						github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
 | 
				
			||||||
	github.com/golang/mock v1.6.0 // indirect
 | 
						github.com/golang/mock v1.6.0 // indirect
 | 
				
			||||||
	github.com/golang/snappy v0.0.4 // indirect
 | 
						github.com/golang/snappy v0.0.4 // indirect
 | 
				
			||||||
@ -119,7 +121,7 @@ require (
 | 
				
			|||||||
	github.com/google/go-cmp v0.6.0 // indirect
 | 
						github.com/google/go-cmp v0.6.0 // indirect
 | 
				
			||||||
	github.com/google/orderedcode v0.0.1 // indirect
 | 
						github.com/google/orderedcode v0.0.1 // indirect
 | 
				
			||||||
	github.com/google/s2a-go v0.1.7 // indirect
 | 
						github.com/google/s2a-go v0.1.7 // indirect
 | 
				
			||||||
	github.com/google/uuid v1.4.0 // indirect
 | 
						github.com/google/uuid v1.6.0 // indirect
 | 
				
			||||||
	github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect
 | 
						github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect
 | 
				
			||||||
	github.com/googleapis/gax-go/v2 v2.12.0 // indirect
 | 
						github.com/googleapis/gax-go/v2 v2.12.0 // indirect
 | 
				
			||||||
	github.com/gorilla/handlers v1.5.1 // indirect
 | 
						github.com/gorilla/handlers v1.5.1 // indirect
 | 
				
			||||||
@ -133,7 +135,7 @@ require (
 | 
				
			|||||||
	github.com/hashicorp/go-immutable-radix v1.3.1 // indirect
 | 
						github.com/hashicorp/go-immutable-radix v1.3.1 // indirect
 | 
				
			||||||
	github.com/hashicorp/go-safetemp v1.0.0 // indirect
 | 
						github.com/hashicorp/go-safetemp v1.0.0 // indirect
 | 
				
			||||||
	github.com/hashicorp/go-version v1.6.0 // indirect
 | 
						github.com/hashicorp/go-version v1.6.0 // indirect
 | 
				
			||||||
	github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect
 | 
						github.com/hashicorp/golang-lru v1.0.2 // indirect
 | 
				
			||||||
	github.com/hashicorp/hcl v1.0.0 // indirect
 | 
						github.com/hashicorp/hcl v1.0.0 // indirect
 | 
				
			||||||
	github.com/hdevalence/ed25519consensus v0.1.0 // indirect
 | 
						github.com/hdevalence/ed25519consensus v0.1.0 // indirect
 | 
				
			||||||
	github.com/holiman/bloomfilter/v2 v2.0.3 // indirect
 | 
						github.com/holiman/bloomfilter/v2 v2.0.3 // indirect
 | 
				
			||||||
@ -146,7 +148,7 @@ require (
 | 
				
			|||||||
	github.com/jackpal/go-nat-pmp v1.0.2 // indirect
 | 
						github.com/jackpal/go-nat-pmp v1.0.2 // indirect
 | 
				
			||||||
	github.com/jmespath/go-jmespath v0.4.0 // indirect
 | 
						github.com/jmespath/go-jmespath v0.4.0 // indirect
 | 
				
			||||||
	github.com/jmhodges/levigo v1.0.0 // indirect
 | 
						github.com/jmhodges/levigo v1.0.0 // indirect
 | 
				
			||||||
	github.com/klauspost/compress v1.16.7 // indirect
 | 
						github.com/klauspost/compress v1.17.7 // indirect
 | 
				
			||||||
	github.com/kr/pretty v0.3.1 // indirect
 | 
						github.com/kr/pretty v0.3.1 // indirect
 | 
				
			||||||
	github.com/kr/text v0.2.0 // indirect
 | 
						github.com/kr/text v0.2.0 // indirect
 | 
				
			||||||
	github.com/lib/pq v1.10.7 // indirect
 | 
						github.com/lib/pq v1.10.7 // indirect
 | 
				
			||||||
@ -164,29 +166,29 @@ require (
 | 
				
			|||||||
	github.com/mitchellh/mapstructure v1.5.0 // indirect
 | 
						github.com/mitchellh/mapstructure v1.5.0 // indirect
 | 
				
			||||||
	github.com/mtibben/percent v0.2.1 // indirect
 | 
						github.com/mtibben/percent v0.2.1 // indirect
 | 
				
			||||||
	github.com/olekukonko/tablewriter v0.0.5 // indirect
 | 
						github.com/olekukonko/tablewriter v0.0.5 // indirect
 | 
				
			||||||
	github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08 // indirect
 | 
						github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67 // indirect
 | 
				
			||||||
	github.com/pkg/errors v0.9.1 // indirect
 | 
						github.com/pkg/errors v0.9.1 // indirect
 | 
				
			||||||
	github.com/pmezard/go-difflib v1.0.0 // indirect
 | 
						github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
 | 
				
			||||||
	github.com/prometheus/client_model v0.3.0 // indirect
 | 
						github.com/prometheus/client_model v0.6.1 // indirect
 | 
				
			||||||
	github.com/prometheus/common v0.42.0 // indirect
 | 
						github.com/prometheus/common v0.42.0 // indirect
 | 
				
			||||||
	github.com/prometheus/procfs v0.9.0 // indirect
 | 
						github.com/prometheus/procfs v0.13.0 // indirect
 | 
				
			||||||
	github.com/prometheus/tsdb v0.7.1 // indirect
 | 
						github.com/prometheus/tsdb v0.7.1 // indirect
 | 
				
			||||||
	github.com/rakyll/statik v0.1.7 // indirect
 | 
						github.com/rakyll/statik v0.1.7 // indirect
 | 
				
			||||||
	github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
 | 
						github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
 | 
				
			||||||
	github.com/rjeczalik/notify v0.9.1 // indirect
 | 
						github.com/rjeczalik/notify v0.9.1 // indirect
 | 
				
			||||||
	github.com/rogpeppe/go-internal v1.11.0 // indirect
 | 
						github.com/rogpeppe/go-internal v1.12.0 // indirect
 | 
				
			||||||
	github.com/rs/cors v1.8.3 // indirect
 | 
						github.com/rs/cors v1.8.3 // indirect
 | 
				
			||||||
	github.com/rs/zerolog v1.32.0 // indirect
 | 
						github.com/rs/zerolog v1.32.0 // indirect
 | 
				
			||||||
	github.com/sasha-s/go-deadlock v0.3.1 // indirect
 | 
						github.com/sasha-s/go-deadlock v0.3.1 // indirect
 | 
				
			||||||
	github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect
 | 
						github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect
 | 
				
			||||||
	github.com/spf13/afero v1.9.5 // indirect
 | 
						github.com/spf13/afero v1.11.0 // indirect
 | 
				
			||||||
	github.com/spf13/jwalterweatherman v1.1.0 // indirect
 | 
						github.com/spf13/jwalterweatherman v1.1.0 // indirect
 | 
				
			||||||
	github.com/spf13/pflag v1.0.5 // indirect
 | 
						github.com/spf13/pflag v1.0.5 // indirect
 | 
				
			||||||
	github.com/status-im/keycard-go v0.2.0 // indirect
 | 
						github.com/status-im/keycard-go v0.2.0 // indirect
 | 
				
			||||||
	github.com/stretchr/objx v0.5.2 // indirect
 | 
						github.com/stretchr/objx v0.5.2 // indirect
 | 
				
			||||||
	github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect
 | 
						github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect
 | 
				
			||||||
	github.com/tendermint/go-amino v0.16.0 // indirect
 | 
						github.com/tendermint/go-amino v0.16.0 // indirect
 | 
				
			||||||
	github.com/tidwall/btree v1.6.0 // indirect
 | 
						github.com/tidwall/btree v1.7.0 // indirect
 | 
				
			||||||
	github.com/tklauser/go-sysconf v0.3.10 // indirect
 | 
						github.com/tklauser/go-sysconf v0.3.10 // indirect
 | 
				
			||||||
	github.com/tklauser/numcpus v0.4.0 // indirect
 | 
						github.com/tklauser/numcpus v0.4.0 // indirect
 | 
				
			||||||
	github.com/tyler-smith/go-bip39 v1.1.0 // indirect
 | 
						github.com/tyler-smith/go-bip39 v1.1.0 // indirect
 | 
				
			||||||
@ -195,19 +197,22 @@ require (
 | 
				
			|||||||
	github.com/zondax/ledger-go v0.14.3 // indirect
 | 
						github.com/zondax/ledger-go v0.14.3 // indirect
 | 
				
			||||||
	go.etcd.io/bbolt v1.3.8 // indirect
 | 
						go.etcd.io/bbolt v1.3.8 // indirect
 | 
				
			||||||
	go.opencensus.io v0.24.0 // indirect
 | 
						go.opencensus.io v0.24.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel v1.19.0 // indirect
 | 
						go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/metric v1.19.0 // indirect
 | 
						go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/trace v1.19.0 // indirect
 | 
						go.opentelemetry.io/otel v1.22.0 // indirect
 | 
				
			||||||
	golang.org/x/net v0.19.0 // indirect
 | 
						go.opentelemetry.io/otel/metric v1.22.0 // indirect
 | 
				
			||||||
	golang.org/x/oauth2 v0.13.0 // indirect
 | 
						go.opentelemetry.io/otel/trace v1.22.0 // indirect
 | 
				
			||||||
	golang.org/x/sync v0.4.0 // indirect
 | 
						golang.org/x/net v0.24.0 // indirect
 | 
				
			||||||
	golang.org/x/sys v0.16.0 // indirect
 | 
						golang.org/x/oauth2 v0.17.0 // indirect
 | 
				
			||||||
	golang.org/x/term v0.15.0 // indirect
 | 
						golang.org/x/sync v0.7.0 // indirect
 | 
				
			||||||
 | 
						golang.org/x/sys v0.19.0 // indirect
 | 
				
			||||||
 | 
						golang.org/x/term v0.19.0 // indirect
 | 
				
			||||||
	golang.org/x/text v0.14.0 // indirect
 | 
						golang.org/x/text v0.14.0 // indirect
 | 
				
			||||||
	google.golang.org/api v0.149.0 // indirect
 | 
						golang.org/x/time v0.5.0 // indirect
 | 
				
			||||||
 | 
						google.golang.org/api v0.162.0 // indirect
 | 
				
			||||||
	google.golang.org/appengine v1.6.8 // indirect
 | 
						google.golang.org/appengine v1.6.8 // indirect
 | 
				
			||||||
	google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917 // indirect
 | 
						google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect
 | 
				
			||||||
	google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1 // indirect
 | 
						google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect
 | 
				
			||||||
	gopkg.in/ini.v1 v1.67.0 // indirect
 | 
						gopkg.in/ini.v1 v1.67.0 // indirect
 | 
				
			||||||
	gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect
 | 
						gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect
 | 
				
			||||||
	gopkg.in/yaml.v3 v3.0.1 // indirect
 | 
						gopkg.in/yaml.v3 v3.0.1 // indirect
 | 
				
			||||||
@ -225,8 +230,9 @@ replace (
 | 
				
			|||||||
	github.com/cosmos/cosmos-sdk => github.com/kava-labs/cosmos-sdk v0.47.10-iavl-v1-kava.1
 | 
						github.com/cosmos/cosmos-sdk => github.com/kava-labs/cosmos-sdk v0.47.10-iavl-v1-kava.1
 | 
				
			||||||
	// See https://github.com/cosmos/cosmos-sdk/pull/13093
 | 
						// See https://github.com/cosmos/cosmos-sdk/pull/13093
 | 
				
			||||||
	github.com/dgrijalva/jwt-go => github.com/golang-jwt/jwt/v4 v4.4.2
 | 
						github.com/dgrijalva/jwt-go => github.com/golang-jwt/jwt/v4 v4.4.2
 | 
				
			||||||
 | 
						github.com/ethereum/go-ethereum => github.com/Kava-Labs/go-ethereum v1.10.27-0.20240308170502-da7973e5eee0
 | 
				
			||||||
	// Use ethermint fork that respects min-gas-price with NoBaseFee true and london enabled, and includes eip712 support
 | 
						// Use ethermint fork that respects min-gas-price with NoBaseFee true and london enabled, and includes eip712 support
 | 
				
			||||||
	github.com/evmos/ethermint => github.com/kava-labs/ethermint v0.21.0-kava-v26.3
 | 
						github.com/evmos/ethermint => github.com/kava-labs/ethermint v0.21.1-0.20240703152838-badab86e5aba
 | 
				
			||||||
	// See https://github.com/cosmos/cosmos-sdk/pull/10401, https://github.com/cosmos/cosmos-sdk/commit/0592ba6158cd0bf49d894be1cef4faeec59e8320
 | 
						// See https://github.com/cosmos/cosmos-sdk/pull/10401, https://github.com/cosmos/cosmos-sdk/commit/0592ba6158cd0bf49d894be1cef4faeec59e8320
 | 
				
			||||||
	github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.9.0
 | 
						github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.9.0
 | 
				
			||||||
	// Downgraded to avoid bugs in following commits which causes "version does not exist" errors
 | 
						// Downgraded to avoid bugs in following commits which causes "version does not exist" errors
 | 
				
			||||||
 | 
				
			|||||||
@ -17,11 +17,11 @@ require (
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require (
 | 
					require (
 | 
				
			||||||
	cloud.google.com/go v0.111.0 // indirect
 | 
						cloud.google.com/go v0.112.0 // indirect
 | 
				
			||||||
	cloud.google.com/go/compute v1.23.3 // indirect
 | 
						cloud.google.com/go/compute v1.24.0 // indirect
 | 
				
			||||||
	cloud.google.com/go/compute/metadata v0.2.3 // indirect
 | 
						cloud.google.com/go/compute/metadata v0.2.3 // indirect
 | 
				
			||||||
	cloud.google.com/go/iam v1.1.5 // indirect
 | 
						cloud.google.com/go/iam v1.1.6 // indirect
 | 
				
			||||||
	cloud.google.com/go/storage v1.35.1 // indirect
 | 
						cloud.google.com/go/storage v1.36.0 // indirect
 | 
				
			||||||
	cosmossdk.io/api v0.3.1 // indirect
 | 
						cosmossdk.io/api v0.3.1 // indirect
 | 
				
			||||||
	cosmossdk.io/core v0.6.1 // indirect
 | 
						cosmossdk.io/core v0.6.1 // indirect
 | 
				
			||||||
	cosmossdk.io/depinject v1.0.0-alpha.4 // indirect
 | 
						cosmossdk.io/depinject v1.0.0-alpha.4 // indirect
 | 
				
			||||||
@ -33,7 +33,7 @@ require (
 | 
				
			|||||||
	github.com/99designs/keyring v1.2.2 // indirect
 | 
						github.com/99designs/keyring v1.2.2 // indirect
 | 
				
			||||||
	github.com/BurntSushi/toml v1.3.2 // indirect
 | 
						github.com/BurntSushi/toml v1.3.2 // indirect
 | 
				
			||||||
	github.com/ChainSafe/go-schnorrkel v1.0.0 // indirect
 | 
						github.com/ChainSafe/go-schnorrkel v1.0.0 // indirect
 | 
				
			||||||
	github.com/DataDog/zstd v1.5.2 // indirect
 | 
						github.com/DataDog/zstd v1.5.5 // indirect
 | 
				
			||||||
	github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect
 | 
						github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect
 | 
				
			||||||
	github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect
 | 
						github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect
 | 
				
			||||||
	github.com/Microsoft/go-winio v0.6.1 // indirect
 | 
						github.com/Microsoft/go-winio v0.6.1 // indirect
 | 
				
			||||||
@ -52,7 +52,7 @@ require (
 | 
				
			|||||||
	github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect
 | 
						github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect
 | 
				
			||||||
	github.com/cenkalti/backoff/v4 v4.1.3 // indirect
 | 
						github.com/cenkalti/backoff/v4 v4.1.3 // indirect
 | 
				
			||||||
	github.com/cespare/xxhash v1.1.0 // indirect
 | 
						github.com/cespare/xxhash v1.1.0 // indirect
 | 
				
			||||||
	github.com/cespare/xxhash/v2 v2.2.0 // indirect
 | 
						github.com/cespare/xxhash/v2 v2.3.0 // indirect
 | 
				
			||||||
	github.com/chzyer/readline v1.5.1 // indirect
 | 
						github.com/chzyer/readline v1.5.1 // indirect
 | 
				
			||||||
	github.com/cockroachdb/errors v1.11.1 // indirect
 | 
						github.com/cockroachdb/errors v1.11.1 // indirect
 | 
				
			||||||
	github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
 | 
						github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
 | 
				
			||||||
@ -64,8 +64,8 @@ require (
 | 
				
			|||||||
	github.com/cometbft/cometbft-db v0.9.1 // indirect
 | 
						github.com/cometbft/cometbft-db v0.9.1 // indirect
 | 
				
			||||||
	github.com/confio/ics23/go v0.9.0 // indirect
 | 
						github.com/confio/ics23/go v0.9.0 // indirect
 | 
				
			||||||
	github.com/cosmos/btcutil v1.0.5 // indirect
 | 
						github.com/cosmos/btcutil v1.0.5 // indirect
 | 
				
			||||||
	github.com/cosmos/cosmos-db v1.0.0 // indirect
 | 
						github.com/cosmos/cosmos-db v1.0.2 // indirect
 | 
				
			||||||
	github.com/cosmos/cosmos-proto v1.0.0-beta.4 // indirect
 | 
						github.com/cosmos/cosmos-proto v1.0.0-beta.5 // indirect
 | 
				
			||||||
	github.com/cosmos/go-bip39 v1.0.0 // indirect
 | 
						github.com/cosmos/go-bip39 v1.0.0 // indirect
 | 
				
			||||||
	github.com/cosmos/gogogateway v1.2.0 // indirect
 | 
						github.com/cosmos/gogogateway v1.2.0 // indirect
 | 
				
			||||||
	github.com/cosmos/gogoproto v1.4.10 // indirect
 | 
						github.com/cosmos/gogoproto v1.4.10 // indirect
 | 
				
			||||||
@ -74,7 +74,7 @@ require (
 | 
				
			|||||||
	github.com/cosmos/ibc-go/modules/capability v1.0.0-rc1 // indirect
 | 
						github.com/cosmos/ibc-go/modules/capability v1.0.0-rc1 // indirect
 | 
				
			||||||
	github.com/cosmos/ics23/go v0.10.0 // indirect
 | 
						github.com/cosmos/ics23/go v0.10.0 // indirect
 | 
				
			||||||
	github.com/cosmos/interchain-security/v3 v3.1.1-0.20231102122221-81650a84f989 // indirect
 | 
						github.com/cosmos/interchain-security/v3 v3.1.1-0.20231102122221-81650a84f989 // indirect
 | 
				
			||||||
	github.com/cosmos/ledger-cosmos-go v0.13.1 // indirect
 | 
						github.com/cosmos/ledger-cosmos-go v0.13.3 // indirect
 | 
				
			||||||
	github.com/cosmos/rosetta-sdk-go v0.10.0 // indirect
 | 
						github.com/cosmos/rosetta-sdk-go v0.10.0 // indirect
 | 
				
			||||||
	github.com/creachadair/taskgroup v0.4.2 // indirect
 | 
						github.com/creachadair/taskgroup v0.4.2 // indirect
 | 
				
			||||||
	github.com/danieljoos/wincred v1.1.2 // indirect
 | 
						github.com/danieljoos/wincred v1.1.2 // indirect
 | 
				
			||||||
@ -95,23 +95,23 @@ require (
 | 
				
			|||||||
	github.com/dustin/go-humanize v1.0.1 // indirect
 | 
						github.com/dustin/go-humanize v1.0.1 // indirect
 | 
				
			||||||
	github.com/dvsekhvalnov/jose2go v1.6.0 // indirect
 | 
						github.com/dvsekhvalnov/jose2go v1.6.0 // indirect
 | 
				
			||||||
	github.com/edsrzf/mmap-go v1.0.0 // indirect
 | 
						github.com/edsrzf/mmap-go v1.0.0 // indirect
 | 
				
			||||||
	github.com/emicklei/dot v1.4.2 // indirect
 | 
						github.com/emicklei/dot v1.6.1 // indirect
 | 
				
			||||||
	github.com/evmos/ethermint v0.21.0 // indirect
 | 
						github.com/evmos/ethermint v0.21.0 // indirect
 | 
				
			||||||
	github.com/felixge/httpsnoop v1.0.2 // indirect
 | 
						github.com/felixge/httpsnoop v1.0.4 // indirect
 | 
				
			||||||
	github.com/fsnotify/fsnotify v1.7.0 // indirect
 | 
						github.com/fsnotify/fsnotify v1.7.0 // indirect
 | 
				
			||||||
	github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff // indirect
 | 
						github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff // indirect
 | 
				
			||||||
	github.com/getsentry/sentry-go v0.23.0 // indirect
 | 
						github.com/getsentry/sentry-go v0.27.0 // indirect
 | 
				
			||||||
	github.com/go-kit/kit v0.12.0 // indirect
 | 
						github.com/go-kit/kit v0.13.0 // indirect
 | 
				
			||||||
	github.com/go-kit/log v0.2.1 // indirect
 | 
						github.com/go-kit/log v0.2.1 // indirect
 | 
				
			||||||
	github.com/go-logfmt/logfmt v0.6.0 // indirect
 | 
						github.com/go-logfmt/logfmt v0.6.0 // indirect
 | 
				
			||||||
	github.com/go-logr/logr v1.2.4 // indirect
 | 
						github.com/go-logr/logr v1.4.1 // indirect
 | 
				
			||||||
	github.com/go-logr/stdr v1.2.2 // indirect
 | 
						github.com/go-logr/stdr v1.2.2 // indirect
 | 
				
			||||||
	github.com/go-ole/go-ole v1.3.0 // indirect
 | 
						github.com/go-ole/go-ole v1.3.0 // indirect
 | 
				
			||||||
	github.com/go-stack/stack v1.8.1 // indirect
 | 
						github.com/go-stack/stack v1.8.1 // indirect
 | 
				
			||||||
	github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect
 | 
						github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect
 | 
				
			||||||
	github.com/gogo/googleapis v1.4.1 // indirect
 | 
						github.com/gogo/googleapis v1.4.1 // indirect
 | 
				
			||||||
	github.com/gogo/protobuf v1.3.3 // indirect
 | 
						github.com/gogo/protobuf v1.3.3 // indirect
 | 
				
			||||||
	github.com/golang/glog v1.1.2 // indirect
 | 
						github.com/golang/glog v1.2.0 // indirect
 | 
				
			||||||
	github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
 | 
						github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
 | 
				
			||||||
	github.com/golang/mock v1.6.0 // indirect
 | 
						github.com/golang/mock v1.6.0 // indirect
 | 
				
			||||||
	github.com/golang/protobuf v1.5.4 // indirect
 | 
						github.com/golang/protobuf v1.5.4 // indirect
 | 
				
			||||||
@ -120,7 +120,7 @@ require (
 | 
				
			|||||||
	github.com/google/go-cmp v0.6.0 // indirect
 | 
						github.com/google/go-cmp v0.6.0 // indirect
 | 
				
			||||||
	github.com/google/orderedcode v0.0.1 // indirect
 | 
						github.com/google/orderedcode v0.0.1 // indirect
 | 
				
			||||||
	github.com/google/s2a-go v0.1.7 // indirect
 | 
						github.com/google/s2a-go v0.1.7 // indirect
 | 
				
			||||||
	github.com/google/uuid v1.4.0 // indirect
 | 
						github.com/google/uuid v1.6.0 // indirect
 | 
				
			||||||
	github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect
 | 
						github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect
 | 
				
			||||||
	github.com/googleapis/gax-go/v2 v2.12.0 // indirect
 | 
						github.com/googleapis/gax-go/v2 v2.12.0 // indirect
 | 
				
			||||||
	github.com/gorilla/handlers v1.5.1 // indirect
 | 
						github.com/gorilla/handlers v1.5.1 // indirect
 | 
				
			||||||
@ -136,7 +136,7 @@ require (
 | 
				
			|||||||
	github.com/hashicorp/go-immutable-radix v1.3.1 // indirect
 | 
						github.com/hashicorp/go-immutable-radix v1.3.1 // indirect
 | 
				
			||||||
	github.com/hashicorp/go-safetemp v1.0.0 // indirect
 | 
						github.com/hashicorp/go-safetemp v1.0.0 // indirect
 | 
				
			||||||
	github.com/hashicorp/go-version v1.6.0 // indirect
 | 
						github.com/hashicorp/go-version v1.6.0 // indirect
 | 
				
			||||||
	github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect
 | 
						github.com/hashicorp/golang-lru v1.0.2 // indirect
 | 
				
			||||||
	github.com/hashicorp/hcl v1.0.0 // indirect
 | 
						github.com/hashicorp/hcl v1.0.0 // indirect
 | 
				
			||||||
	github.com/hdevalence/ed25519consensus v0.1.0 // indirect
 | 
						github.com/hdevalence/ed25519consensus v0.1.0 // indirect
 | 
				
			||||||
	github.com/holiman/bloomfilter/v2 v2.0.3 // indirect
 | 
						github.com/holiman/bloomfilter/v2 v2.0.3 // indirect
 | 
				
			||||||
@ -152,7 +152,7 @@ require (
 | 
				
			|||||||
	github.com/jmespath/go-jmespath v0.4.0 // indirect
 | 
						github.com/jmespath/go-jmespath v0.4.0 // indirect
 | 
				
			||||||
	github.com/jmhodges/levigo v1.0.0 // indirect
 | 
						github.com/jmhodges/levigo v1.0.0 // indirect
 | 
				
			||||||
	github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
 | 
						github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
 | 
				
			||||||
	github.com/klauspost/compress v1.17.0 // indirect
 | 
						github.com/klauspost/compress v1.17.7 // indirect
 | 
				
			||||||
	github.com/klauspost/cpuid/v2 v2.2.4 // indirect
 | 
						github.com/klauspost/cpuid/v2 v2.2.4 // indirect
 | 
				
			||||||
	github.com/kr/pretty v0.3.1 // indirect
 | 
						github.com/kr/pretty v0.3.1 // indirect
 | 
				
			||||||
	github.com/kr/text v0.2.0 // indirect
 | 
						github.com/kr/text v0.2.0 // indirect
 | 
				
			||||||
@ -187,21 +187,21 @@ require (
 | 
				
			|||||||
	github.com/opencontainers/image-spec v1.1.0-rc2 // indirect
 | 
						github.com/opencontainers/image-spec v1.1.0-rc2 // indirect
 | 
				
			||||||
	github.com/pelletier/go-toml v1.9.5 // indirect
 | 
						github.com/pelletier/go-toml v1.9.5 // indirect
 | 
				
			||||||
	github.com/pelletier/go-toml/v2 v2.1.0 // indirect
 | 
						github.com/pelletier/go-toml/v2 v2.1.0 // indirect
 | 
				
			||||||
	github.com/petermattis/goid v0.0.0-20230518223814-80aa455d8761 // indirect
 | 
						github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67 // indirect
 | 
				
			||||||
	github.com/pierrec/xxHash v0.1.5 // indirect
 | 
						github.com/pierrec/xxHash v0.1.5 // indirect
 | 
				
			||||||
	github.com/pkg/errors v0.9.1 // indirect
 | 
						github.com/pkg/errors v0.9.1 // indirect
 | 
				
			||||||
	github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
 | 
						github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
 | 
				
			||||||
	github.com/prometheus/client_golang v1.17.0 // indirect
 | 
						github.com/prometheus/client_golang v1.17.0 // indirect
 | 
				
			||||||
	github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 // indirect
 | 
						github.com/prometheus/client_model v0.6.1 // indirect
 | 
				
			||||||
	github.com/prometheus/common v0.44.0 // indirect
 | 
						github.com/prometheus/common v0.44.0 // indirect
 | 
				
			||||||
	github.com/prometheus/procfs v0.11.1 // indirect
 | 
						github.com/prometheus/procfs v0.13.0 // indirect
 | 
				
			||||||
	github.com/prometheus/tsdb v0.7.1 // indirect
 | 
						github.com/prometheus/tsdb v0.7.1 // indirect
 | 
				
			||||||
	github.com/rakyll/statik v0.1.7 // indirect
 | 
						github.com/rakyll/statik v0.1.7 // indirect
 | 
				
			||||||
	github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
 | 
						github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
 | 
				
			||||||
	github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
 | 
						github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
 | 
				
			||||||
	github.com/rivo/uniseg v0.4.3 // indirect
 | 
						github.com/rivo/uniseg v0.4.3 // indirect
 | 
				
			||||||
	github.com/rjeczalik/notify v0.9.1 // indirect
 | 
						github.com/rjeczalik/notify v0.9.1 // indirect
 | 
				
			||||||
	github.com/rogpeppe/go-internal v1.11.0 // indirect
 | 
						github.com/rogpeppe/go-internal v1.12.0 // indirect
 | 
				
			||||||
	github.com/rs/cors v1.8.3 // indirect
 | 
						github.com/rs/cors v1.8.3 // indirect
 | 
				
			||||||
	github.com/rs/zerolog v1.32.0 // indirect
 | 
						github.com/rs/zerolog v1.32.0 // indirect
 | 
				
			||||||
	github.com/sagikazarmark/locafero v0.4.0 // indirect
 | 
						github.com/sagikazarmark/locafero v0.4.0 // indirect
 | 
				
			||||||
@ -219,7 +219,7 @@ require (
 | 
				
			|||||||
	github.com/subosito/gotenv v1.6.0 // indirect
 | 
						github.com/subosito/gotenv v1.6.0 // indirect
 | 
				
			||||||
	github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect
 | 
						github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect
 | 
				
			||||||
	github.com/tendermint/go-amino v0.16.0 // indirect
 | 
						github.com/tendermint/go-amino v0.16.0 // indirect
 | 
				
			||||||
	github.com/tidwall/btree v1.6.0 // indirect
 | 
						github.com/tidwall/btree v1.7.0 // indirect
 | 
				
			||||||
	github.com/tklauser/go-sysconf v0.3.12 // indirect
 | 
						github.com/tklauser/go-sysconf v0.3.12 // indirect
 | 
				
			||||||
	github.com/tklauser/numcpus v0.6.1 // indirect
 | 
						github.com/tklauser/numcpus v0.6.1 // indirect
 | 
				
			||||||
	github.com/tyler-smith/go-bip32 v1.0.0 // indirect
 | 
						github.com/tyler-smith/go-bip32 v1.0.0 // indirect
 | 
				
			||||||
@ -230,27 +230,29 @@ require (
 | 
				
			|||||||
	github.com/zondax/ledger-go v0.14.3 // indirect
 | 
						github.com/zondax/ledger-go v0.14.3 // indirect
 | 
				
			||||||
	go.etcd.io/bbolt v1.3.8 // indirect
 | 
						go.etcd.io/bbolt v1.3.8 // indirect
 | 
				
			||||||
	go.opencensus.io v0.24.0 // indirect
 | 
						go.opencensus.io v0.24.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel v1.19.0 // indirect
 | 
						go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/metric v1.19.0 // indirect
 | 
						go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/trace v1.19.0 // indirect
 | 
						go.opentelemetry.io/otel v1.22.0 // indirect
 | 
				
			||||||
 | 
						go.opentelemetry.io/otel/metric v1.22.0 // indirect
 | 
				
			||||||
 | 
						go.opentelemetry.io/otel/trace v1.22.0 // indirect
 | 
				
			||||||
	go.uber.org/multierr v1.11.0 // indirect
 | 
						go.uber.org/multierr v1.11.0 // indirect
 | 
				
			||||||
	golang.org/x/crypto v0.22.0 // indirect
 | 
						golang.org/x/crypto v0.22.0 // indirect
 | 
				
			||||||
	golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect
 | 
						golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect
 | 
				
			||||||
	golang.org/x/mod v0.17.0 // indirect
 | 
						golang.org/x/mod v0.17.0 // indirect
 | 
				
			||||||
	golang.org/x/net v0.24.0 // indirect
 | 
						golang.org/x/net v0.24.0 // indirect
 | 
				
			||||||
	golang.org/x/oauth2 v0.15.0 // indirect
 | 
						golang.org/x/oauth2 v0.17.0 // indirect
 | 
				
			||||||
	golang.org/x/sync v0.7.0 // indirect
 | 
						golang.org/x/sync v0.7.0 // indirect
 | 
				
			||||||
	golang.org/x/sys v0.19.0 // indirect
 | 
						golang.org/x/sys v0.19.0 // indirect
 | 
				
			||||||
	golang.org/x/term v0.19.0 // indirect
 | 
						golang.org/x/term v0.19.0 // indirect
 | 
				
			||||||
	golang.org/x/text v0.14.0 // indirect
 | 
						golang.org/x/text v0.14.0 // indirect
 | 
				
			||||||
	golang.org/x/time v0.5.0 // indirect
 | 
						golang.org/x/time v0.5.0 // indirect
 | 
				
			||||||
	golang.org/x/tools v0.20.0 // indirect
 | 
						golang.org/x/tools v0.20.0 // indirect
 | 
				
			||||||
	google.golang.org/api v0.153.0 // indirect
 | 
						google.golang.org/api v0.162.0 // indirect
 | 
				
			||||||
	google.golang.org/appengine v1.6.8 // indirect
 | 
						google.golang.org/appengine v1.6.8 // indirect
 | 
				
			||||||
	google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917 // indirect
 | 
						google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect
 | 
				
			||||||
	google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0 // indirect
 | 
						google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect
 | 
				
			||||||
	google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1 // indirect
 | 
						google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect
 | 
				
			||||||
	google.golang.org/grpc v1.60.1 // indirect
 | 
						google.golang.org/grpc v1.63.2 // indirect
 | 
				
			||||||
	google.golang.org/protobuf v1.33.0 // indirect
 | 
						google.golang.org/protobuf v1.33.0 // indirect
 | 
				
			||||||
	gopkg.in/ini.v1 v1.67.0 // indirect
 | 
						gopkg.in/ini.v1 v1.67.0 // indirect
 | 
				
			||||||
	gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect
 | 
						gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect
 | 
				
			||||||
@ -280,8 +282,9 @@ replace (
 | 
				
			|||||||
	github.com/cometbft/cometbft-db => github.com/kava-labs/cometbft-db v0.9.1-kava.2
 | 
						github.com/cometbft/cometbft-db => github.com/kava-labs/cometbft-db v0.9.1-kava.2
 | 
				
			||||||
	// Use cosmos-sdk fork with backported fix for unsafe-reset-all, staking transfer events, and custom tally handler support
 | 
						// Use cosmos-sdk fork with backported fix for unsafe-reset-all, staking transfer events, and custom tally handler support
 | 
				
			||||||
	github.com/cosmos/cosmos-sdk => github.com/kava-labs/cosmos-sdk v0.47.10-iavl-v1-kava.1
 | 
						github.com/cosmos/cosmos-sdk => github.com/kava-labs/cosmos-sdk v0.47.10-iavl-v1-kava.1
 | 
				
			||||||
 | 
						github.com/ethereum/go-ethereum => github.com/Kava-Labs/go-ethereum v1.10.27-0.20240308170502-da7973e5eee0
 | 
				
			||||||
	// Use ethermint fork that respects min-gas-price with NoBaseFee true and london enabled, and includes eip712 support
 | 
						// Use ethermint fork that respects min-gas-price with NoBaseFee true and london enabled, and includes eip712 support
 | 
				
			||||||
	github.com/evmos/ethermint => github.com/kava-labs/ethermint v0.21.0-kava-v26.3
 | 
						github.com/evmos/ethermint => github.com/kava-labs/ethermint v0.21.1-0.20240703152838-badab86e5aba
 | 
				
			||||||
	github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1
 | 
						github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1
 | 
				
			||||||
	// github.com/ComposableFi/go-subkey/v2 => github.com/vedhavyas/go-subkey/v2 v2.0.0
 | 
						// github.com/ComposableFi/go-subkey/v2 => github.com/vedhavyas/go-subkey/v2 v2.0.0
 | 
				
			||||||
	github.com/misko9/go-substrate-rpc-client/v4 => github.com/faddat/go-substrate-rpc-client/v4 v4.0.1-0.20240402155230-48db8c110afe
 | 
						github.com/misko9/go-substrate-rpc-client/v4 => github.com/faddat/go-substrate-rpc-client/v4 v4.0.1-0.20240402155230-48db8c110afe
 | 
				
			||||||
 | 
				
			|||||||
@ -30,8 +30,8 @@ cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w9
 | 
				
			|||||||
cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc=
 | 
					cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc=
 | 
				
			||||||
cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU=
 | 
					cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU=
 | 
				
			||||||
cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA=
 | 
					cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA=
 | 
				
			||||||
cloud.google.com/go v0.111.0 h1:YHLKNupSD1KqjDbQ3+LVdQ81h/UJbJyZG203cEfnQgM=
 | 
					cloud.google.com/go v0.112.0 h1:tpFCD7hpHFlQ8yPwT3x+QeXqc2T6+n6T+hmABHfDUSM=
 | 
				
			||||||
cloud.google.com/go v0.111.0/go.mod h1:0mibmpKP1TyOOFYQY5izo0LnT+ecvOQ0Sg3OdmMiNRU=
 | 
					cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnPD4=
 | 
				
			||||||
cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw=
 | 
					cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw=
 | 
				
			||||||
cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY=
 | 
					cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY=
 | 
				
			||||||
cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI=
 | 
					cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI=
 | 
				
			||||||
@ -68,8 +68,8 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz
 | 
				
			|||||||
cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU=
 | 
					cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU=
 | 
				
			||||||
cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U=
 | 
					cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U=
 | 
				
			||||||
cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU=
 | 
					cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU=
 | 
				
			||||||
cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk=
 | 
					cloud.google.com/go/compute v1.24.0 h1:phWcR2eWzRJaL/kOiJwfFsPs4BaKq1j6vnpZrc1YlVg=
 | 
				
			||||||
cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI=
 | 
					cloud.google.com/go/compute v1.24.0/go.mod h1:kw1/T+h/+tK2LJK0wiPPx1intgdAM3j/g3hFDlscY40=
 | 
				
			||||||
cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY=
 | 
					cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY=
 | 
				
			||||||
cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=
 | 
					cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=
 | 
				
			||||||
cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I=
 | 
					cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I=
 | 
				
			||||||
@ -109,8 +109,8 @@ cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y97
 | 
				
			|||||||
cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc=
 | 
					cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc=
 | 
				
			||||||
cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY=
 | 
					cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY=
 | 
				
			||||||
cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc=
 | 
					cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc=
 | 
				
			||||||
cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI=
 | 
					cloud.google.com/go/iam v1.1.6 h1:bEa06k05IO4f4uJonbB5iAgKTPpABy1ayxaIZV/GHVc=
 | 
				
			||||||
cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8=
 | 
					cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI=
 | 
				
			||||||
cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic=
 | 
					cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic=
 | 
				
			||||||
cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI=
 | 
					cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI=
 | 
				
			||||||
cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8=
 | 
					cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8=
 | 
				
			||||||
@ -171,8 +171,8 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9
 | 
				
			|||||||
cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y=
 | 
					cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y=
 | 
				
			||||||
cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc=
 | 
					cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc=
 | 
				
			||||||
cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s=
 | 
					cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s=
 | 
				
			||||||
cloud.google.com/go/storage v1.35.1 h1:B59ahL//eDfx2IIKFBeT5Atm9wnNmj3+8xG/W4WB//w=
 | 
					cloud.google.com/go/storage v1.36.0 h1:P0mOkAcaJxhCTvAkMhxMfrTKiNcub4YmmPBtlhAyTr8=
 | 
				
			||||||
cloud.google.com/go/storage v1.35.1/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8=
 | 
					cloud.google.com/go/storage v1.36.0/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8=
 | 
				
			||||||
cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw=
 | 
					cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw=
 | 
				
			||||||
cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g=
 | 
					cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g=
 | 
				
			||||||
cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU=
 | 
					cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU=
 | 
				
			||||||
@ -212,12 +212,14 @@ github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbi
 | 
				
			|||||||
github.com/ChainSafe/go-schnorrkel v1.0.0 h1:3aDA67lAykLaG1y3AOjs88dMxC88PgUuHRrLeDnvGIM=
 | 
					github.com/ChainSafe/go-schnorrkel v1.0.0 h1:3aDA67lAykLaG1y3AOjs88dMxC88PgUuHRrLeDnvGIM=
 | 
				
			||||||
github.com/ChainSafe/go-schnorrkel v1.0.0/go.mod h1:dpzHYVxLZcp8pjlV+O+UR8K0Hp/z7vcchBSbMBEhCw4=
 | 
					github.com/ChainSafe/go-schnorrkel v1.0.0/go.mod h1:dpzHYVxLZcp8pjlV+O+UR8K0Hp/z7vcchBSbMBEhCw4=
 | 
				
			||||||
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
 | 
					github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
 | 
				
			||||||
github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8=
 | 
					github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ=
 | 
				
			||||||
github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw=
 | 
					github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw=
 | 
				
			||||||
github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e h1:ahyvB3q25YnZWly5Gq1ekg6jcmWaGj/vG/MhF4aisoc=
 | 
					github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e h1:ahyvB3q25YnZWly5Gq1ekg6jcmWaGj/vG/MhF4aisoc=
 | 
				
			||||||
github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUqhHd//musdITWjFvNTHn90WG9bMLBEPQZ17Cmlpw=
 | 
					github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUqhHd//musdITWjFvNTHn90WG9bMLBEPQZ17Cmlpw=
 | 
				
			||||||
github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec h1:1Qb69mGp/UtRPn422BH4/Y4Q3SLUrD9KHuDkm8iodFc=
 | 
					github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec h1:1Qb69mGp/UtRPn422BH4/Y4Q3SLUrD9KHuDkm8iodFc=
 | 
				
			||||||
github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec/go.mod h1:CD8UlnlLDiqb36L110uqiP2iSflVjx9g/3U9hCI4q2U=
 | 
					github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec/go.mod h1:CD8UlnlLDiqb36L110uqiP2iSflVjx9g/3U9hCI4q2U=
 | 
				
			||||||
 | 
					github.com/Kava-Labs/go-ethereum v1.10.27-0.20240308170502-da7973e5eee0 h1:pPFzOjEZmihLk70TQRPUCWs8uar6nfh4vZ/I1r0zeso=
 | 
				
			||||||
 | 
					github.com/Kava-Labs/go-ethereum v1.10.27-0.20240308170502-da7973e5eee0/go.mod h1:/6CsT5Ceen2WPLI/oCA3xMcZ5sWMF/D46SjM/ayY0Oo=
 | 
				
			||||||
github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
 | 
					github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
 | 
				
			||||||
github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
 | 
					github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
 | 
				
			||||||
github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
 | 
					github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
 | 
				
			||||||
@ -316,8 +318,9 @@ github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW
 | 
				
			|||||||
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
 | 
					github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
 | 
				
			||||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
 | 
					github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
 | 
				
			||||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 | 
					github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 | 
				
			||||||
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
 | 
					 | 
				
			||||||
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 | 
					github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 | 
				
			||||||
 | 
					github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
 | 
				
			||||||
 | 
					github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 | 
				
			||||||
github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s=
 | 
					github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s=
 | 
				
			||||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
 | 
					github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
 | 
				
			||||||
github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM=
 | 
					github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM=
 | 
				
			||||||
@ -343,6 +346,8 @@ github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWH
 | 
				
			|||||||
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
 | 
					github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
 | 
				
			||||||
github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
 | 
					github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
 | 
				
			||||||
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
 | 
					github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
 | 
				
			||||||
 | 
					github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/PB79y4KOPYVyFYdROxgaCwdTQ=
 | 
				
			||||||
 | 
					github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM=
 | 
				
			||||||
github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E=
 | 
					github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E=
 | 
				
			||||||
github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw=
 | 
					github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw=
 | 
				
			||||||
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
 | 
					github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
 | 
				
			||||||
@ -373,10 +378,10 @@ github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV
 | 
				
			|||||||
github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 | 
					github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 | 
				
			||||||
github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk=
 | 
					github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk=
 | 
				
			||||||
github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis=
 | 
					github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis=
 | 
				
			||||||
github.com/cosmos/cosmos-db v1.0.0 h1:EVcQZ+qYag7W6uorBKFPvX6gRjw6Uq2hIh4hCWjuQ0E=
 | 
					github.com/cosmos/cosmos-db v1.0.2 h1:hwMjozuY1OlJs/uh6vddqnk9j7VamLv+0DBlbEXbAKs=
 | 
				
			||||||
github.com/cosmos/cosmos-db v1.0.0/go.mod h1:iBvi1TtqaedwLdcrZVYRSSCb6eSy61NLj4UNmdIgs0U=
 | 
					github.com/cosmos/cosmos-db v1.0.2/go.mod h1:Z8IXcFJ9PqKK6BIsVOB3QXtkKoqUOp1vRvPT39kOXEA=
 | 
				
			||||||
github.com/cosmos/cosmos-proto v1.0.0-beta.4 h1:aEL7tU/rLOmxZQ9z4i7mzxcLbSCY48OdY7lIWTLG7oU=
 | 
					github.com/cosmos/cosmos-proto v1.0.0-beta.5 h1:eNcayDLpip+zVLRLYafhzLvQlSmyab+RC5W7ZfmxJLA=
 | 
				
			||||||
github.com/cosmos/cosmos-proto v1.0.0-beta.4/go.mod h1:oeB+FyVzG3XrQJbJng0EnV8Vljfk9XvTIpGILNU/9Co=
 | 
					github.com/cosmos/cosmos-proto v1.0.0-beta.5/go.mod h1:hQGLpiIUloJBMdQMMWb/4wRApmI9hjHH05nefC0Ojec=
 | 
				
			||||||
github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y=
 | 
					github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y=
 | 
				
			||||||
github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY=
 | 
					github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY=
 | 
				
			||||||
github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw=
 | 
					github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw=
 | 
				
			||||||
@ -399,8 +404,8 @@ github.com/cosmos/interchain-security/v3 v3.1.1-0.20231102122221-81650a84f989 h1
 | 
				
			|||||||
github.com/cosmos/interchain-security/v3 v3.1.1-0.20231102122221-81650a84f989/go.mod h1:5B29fgUbUDTpBTqCnEzA2g3gI5rQG0YE/ir4isb2MEw=
 | 
					github.com/cosmos/interchain-security/v3 v3.1.1-0.20231102122221-81650a84f989/go.mod h1:5B29fgUbUDTpBTqCnEzA2g3gI5rQG0YE/ir4isb2MEw=
 | 
				
			||||||
github.com/cosmos/keyring v1.2.0 h1:8C1lBP9xhImmIabyXW4c3vFjjLiBdGCmfLUfeZlV1Yo=
 | 
					github.com/cosmos/keyring v1.2.0 h1:8C1lBP9xhImmIabyXW4c3vFjjLiBdGCmfLUfeZlV1Yo=
 | 
				
			||||||
github.com/cosmos/keyring v1.2.0/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA=
 | 
					github.com/cosmos/keyring v1.2.0/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA=
 | 
				
			||||||
github.com/cosmos/ledger-cosmos-go v0.13.1 h1:12ac9+GwBb9BjP7X5ygpFk09Itwzjzfmg6A2CWFjoVs=
 | 
					github.com/cosmos/ledger-cosmos-go v0.13.3 h1:7ehuBGuyIytsXbd4MP43mLeoN2LTOEnk5nvue4rK+yM=
 | 
				
			||||||
github.com/cosmos/ledger-cosmos-go v0.13.1/go.mod h1:5tv2RVJEd2+Y38TIQN4CRjJeQGyqOEiKJDfqhk5UjqE=
 | 
					github.com/cosmos/ledger-cosmos-go v0.13.3/go.mod h1:HENcEP+VtahZFw38HZ3+LS3Iv5XV6svsnkk9vdJtLr8=
 | 
				
			||||||
github.com/cosmos/rosetta-sdk-go v0.10.0 h1:E5RhTruuoA7KTIXUcMicL76cffyeoyvNybzUGSKFTcM=
 | 
					github.com/cosmos/rosetta-sdk-go v0.10.0 h1:E5RhTruuoA7KTIXUcMicL76cffyeoyvNybzUGSKFTcM=
 | 
				
			||||||
github.com/cosmos/rosetta-sdk-go v0.10.0/go.mod h1:SImAZkb96YbwvoRkzSMQB6noNJXFgWl/ENIznEoYQI4=
 | 
					github.com/cosmos/rosetta-sdk-go v0.10.0/go.mod h1:SImAZkb96YbwvoRkzSMQB6noNJXFgWl/ENIznEoYQI4=
 | 
				
			||||||
github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk=
 | 
					github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk=
 | 
				
			||||||
@ -469,8 +474,8 @@ github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1
 | 
				
			|||||||
github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
 | 
					github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
 | 
				
			||||||
github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw=
 | 
					github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw=
 | 
				
			||||||
github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
 | 
					github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
 | 
				
			||||||
github.com/emicklei/dot v1.4.2 h1:UbK6gX4yvrpHKlxuUQicwoAis4zl8Dzwit9SnbBAXWw=
 | 
					github.com/emicklei/dot v1.6.1 h1:ujpDlBkkwgWUY+qPId5IwapRW/xEoligRSYjioR6DFI=
 | 
				
			||||||
github.com/emicklei/dot v1.4.2/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s=
 | 
					github.com/emicklei/dot v1.6.1/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s=
 | 
				
			||||||
github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
 | 
					github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
 | 
				
			||||||
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 | 
					github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 | 
				
			||||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 | 
					github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 | 
				
			||||||
@ -482,14 +487,14 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m
 | 
				
			|||||||
github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
 | 
					github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
 | 
				
			||||||
github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
 | 
					github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
 | 
				
			||||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 | 
					github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 | 
				
			||||||
github.com/ethereum/go-ethereum v1.10.26 h1:i/7d9RBBwiXCEuyduBQzJw/mKmnvzsN14jqBmytw72s=
 | 
					github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A=
 | 
				
			||||||
github.com/ethereum/go-ethereum v1.10.26/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg=
 | 
					github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew=
 | 
				
			||||||
github.com/faddat/go-substrate-rpc-client/v4 v4.0.1-0.20240402155230-48db8c110afe h1:63rMpjrCwbJVYoz1XFOzRXCZd8frLSuChg5XSo3tKg4=
 | 
					github.com/faddat/go-substrate-rpc-client/v4 v4.0.1-0.20240402155230-48db8c110afe h1:63rMpjrCwbJVYoz1XFOzRXCZd8frLSuChg5XSo3tKg4=
 | 
				
			||||||
github.com/faddat/go-substrate-rpc-client/v4 v4.0.1-0.20240402155230-48db8c110afe/go.mod h1:enTNfc1aCsOpHnOqlDEDAGr3SzacyTh/VX/nL+5YBs4=
 | 
					github.com/faddat/go-substrate-rpc-client/v4 v4.0.1-0.20240402155230-48db8c110afe/go.mod h1:enTNfc1aCsOpHnOqlDEDAGr3SzacyTh/VX/nL+5YBs4=
 | 
				
			||||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
 | 
					github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
 | 
				
			||||||
github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
 | 
					github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
 | 
				
			||||||
github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o=
 | 
					github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
 | 
				
			||||||
github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
 | 
					github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
 | 
				
			||||||
github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c=
 | 
					github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c=
 | 
				
			||||||
github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0=
 | 
					github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0=
 | 
				
			||||||
github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw=
 | 
					github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw=
 | 
				
			||||||
@ -505,8 +510,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos
 | 
				
			|||||||
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
 | 
					github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
 | 
				
			||||||
github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI=
 | 
					github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI=
 | 
				
			||||||
github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww=
 | 
					github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww=
 | 
				
			||||||
github.com/getsentry/sentry-go v0.23.0 h1:dn+QRCeJv4pPt9OjVXiMcGIBIefaTJPw/h0bZWO05nE=
 | 
					github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
 | 
				
			||||||
github.com/getsentry/sentry-go v0.23.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
 | 
					github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
 | 
				
			||||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 | 
					github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 | 
				
			||||||
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
 | 
					github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
 | 
				
			||||||
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
 | 
					github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
 | 
				
			||||||
@ -518,8 +523,8 @@ github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3Bop
 | 
				
			|||||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 | 
					github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 | 
				
			||||||
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 | 
					github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 | 
				
			||||||
github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o=
 | 
					github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o=
 | 
				
			||||||
github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4=
 | 
					github.com/go-kit/kit v0.13.0 h1:OoneCcHKHQ03LfBpoQCUfCluwd2Vt3ohz+kvbJneZAU=
 | 
				
			||||||
github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs=
 | 
					github.com/go-kit/kit v0.13.0/go.mod h1:phqEHMMUbyrCFCTgH48JueqrM3md2HcAZ8N3XE4FKDg=
 | 
				
			||||||
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
 | 
					github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
 | 
				
			||||||
github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU=
 | 
					github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU=
 | 
				
			||||||
github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
 | 
					github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
 | 
				
			||||||
@ -529,8 +534,8 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG
 | 
				
			|||||||
github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4=
 | 
					github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4=
 | 
				
			||||||
github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
 | 
					github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
 | 
				
			||||||
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 | 
					github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 | 
				
			||||||
github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
 | 
					github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
 | 
				
			||||||
github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 | 
					github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
 | 
				
			||||||
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
 | 
					github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
 | 
				
			||||||
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
 | 
					github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
 | 
				
			||||||
github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
 | 
					github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
 | 
				
			||||||
@ -574,8 +579,8 @@ github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6x
 | 
				
			|||||||
github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog=
 | 
					github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog=
 | 
				
			||||||
github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
 | 
					github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
 | 
				
			||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 | 
					github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 | 
				
			||||||
github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo=
 | 
					github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68=
 | 
				
			||||||
github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ=
 | 
					github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=
 | 
				
			||||||
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 | 
					github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 | 
				
			||||||
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 | 
					github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 | 
				
			||||||
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 | 
					github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 | 
				
			||||||
@ -674,8 +679,8 @@ github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8
 | 
				
			|||||||
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
					github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
				
			||||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
					github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
				
			||||||
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
					github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
				
			||||||
github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4=
 | 
					github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
 | 
				
			||||||
github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
					github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
				
			||||||
github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8=
 | 
					github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8=
 | 
				
			||||||
github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8=
 | 
					github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8=
 | 
				
			||||||
github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg=
 | 
					github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg=
 | 
				
			||||||
@ -752,8 +757,8 @@ github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09
 | 
				
			|||||||
github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
 | 
					github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
 | 
				
			||||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 | 
					github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 | 
				
			||||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 | 
					github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 | 
				
			||||||
github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs=
 | 
					github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=
 | 
				
			||||||
github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
 | 
					github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
 | 
				
			||||||
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
 | 
					github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
 | 
				
			||||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
 | 
					github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
 | 
				
			||||||
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
 | 
					github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
 | 
				
			||||||
@ -822,8 +827,8 @@ github.com/kava-labs/cometbft-db v0.9.1-kava.2 h1:ZQaio886ifvml9XtJB4IYHhlArgA3+
 | 
				
			|||||||
github.com/kava-labs/cometbft-db v0.9.1-kava.2/go.mod h1:PvUZbx7zeR7I4CAvtKBoii/5ia5gXskKjDjIVpt7gDw=
 | 
					github.com/kava-labs/cometbft-db v0.9.1-kava.2/go.mod h1:PvUZbx7zeR7I4CAvtKBoii/5ia5gXskKjDjIVpt7gDw=
 | 
				
			||||||
github.com/kava-labs/cosmos-sdk v0.47.10-iavl-v1-kava.1 h1:vQwrm3sdAG1pkwrsi2mmCHSGDje5fzUR6vApEux/nVA=
 | 
					github.com/kava-labs/cosmos-sdk v0.47.10-iavl-v1-kava.1 h1:vQwrm3sdAG1pkwrsi2mmCHSGDje5fzUR6vApEux/nVA=
 | 
				
			||||||
github.com/kava-labs/cosmos-sdk v0.47.10-iavl-v1-kava.1/go.mod h1:OwLYEBcsnijCLE8gYkwQ7jycZZ/Acd+a83pJU+V+MKw=
 | 
					github.com/kava-labs/cosmos-sdk v0.47.10-iavl-v1-kava.1/go.mod h1:OwLYEBcsnijCLE8gYkwQ7jycZZ/Acd+a83pJU+V+MKw=
 | 
				
			||||||
github.com/kava-labs/ethermint v0.21.0-kava-v26.3 h1:25fl1iNjI+eESaF4AlCpIXBn9YNPlLLjOfwe+HHAp8M=
 | 
					github.com/kava-labs/ethermint v0.21.1-0.20240703152838-badab86e5aba h1:qrBo1h72L9WxZ7nUdpC7KlkTnscUfwWZAcZI1fWyMwE=
 | 
				
			||||||
github.com/kava-labs/ethermint v0.21.0-kava-v26.3/go.mod h1:4nqiVLy8H8UFtgpnmNwX+bbh5QMGLALZ0awUZLCOCMo=
 | 
					github.com/kava-labs/ethermint v0.21.1-0.20240703152838-badab86e5aba/go.mod h1:/Gxb9qs4shgPP2FQMvm2DkZ/7csmEGUh7F5vl7fKQZw=
 | 
				
			||||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
 | 
					github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
 | 
				
			||||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
 | 
					github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
 | 
				
			||||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
 | 
					github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
 | 
				
			||||||
@ -833,8 +838,8 @@ github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYs
 | 
				
			|||||||
github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
 | 
					github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
 | 
				
			||||||
github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
 | 
					github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
 | 
				
			||||||
github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM=
 | 
					github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM=
 | 
				
			||||||
github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM=
 | 
					github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg=
 | 
				
			||||||
github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
 | 
					github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
 | 
				
			||||||
github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
 | 
					github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
 | 
				
			||||||
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
 | 
					github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
 | 
				
			||||||
github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=
 | 
					github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=
 | 
				
			||||||
@ -1010,8 +1015,8 @@ github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6
 | 
				
			|||||||
github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
 | 
					github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
 | 
				
			||||||
github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
 | 
					github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
 | 
				
			||||||
github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o=
 | 
					github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o=
 | 
				
			||||||
github.com/petermattis/goid v0.0.0-20230518223814-80aa455d8761 h1:W04oB3d0J01W5jgYRGKsV8LCM6g9EkCvPkZcmFuy0OE=
 | 
					github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67 h1:jik8PHtAIsPlCRJjJzl4udgEf7hawInF9texMeO2jrU=
 | 
				
			||||||
github.com/petermattis/goid v0.0.0-20230518223814-80aa455d8761/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4=
 | 
					github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4=
 | 
				
			||||||
github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
 | 
					github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
 | 
				
			||||||
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
 | 
					github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
 | 
				
			||||||
github.com/pierrec/xxHash v0.1.5 h1:n/jBpwTHiER4xYvK3/CdPVnLDPchj8eTJFFLUb4QHBo=
 | 
					github.com/pierrec/xxHash v0.1.5 h1:n/jBpwTHiER4xYvK3/CdPVnLDPchj8eTJFFLUb4QHBo=
 | 
				
			||||||
@ -1042,8 +1047,8 @@ github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:
 | 
				
			|||||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 | 
					github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 | 
				
			||||||
github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 | 
					github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 | 
				
			||||||
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 | 
					github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 | 
				
			||||||
github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 h1:v7DLqVdK4VrYkVD5diGdl4sxJurKJEMnODWRJlxV9oM=
 | 
					github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
 | 
				
			||||||
github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU=
 | 
					github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
 | 
				
			||||||
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
 | 
					github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
 | 
				
			||||||
github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
 | 
					github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
 | 
				
			||||||
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
 | 
					github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
 | 
				
			||||||
@ -1059,8 +1064,8 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT
 | 
				
			|||||||
github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
 | 
					github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
 | 
				
			||||||
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
 | 
					github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
 | 
				
			||||||
github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
 | 
					github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
 | 
				
			||||||
github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI=
 | 
					github.com/prometheus/procfs v0.13.0 h1:GqzLlQyfsPbaEHaQkO7tbDlriv/4o5Hudv6OXHGKX7o=
 | 
				
			||||||
github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY=
 | 
					github.com/prometheus/procfs v0.13.0/go.mod h1:cd4PFCR54QLnGKPaKGA6l+cfuNXtht43ZKY6tow0Y1g=
 | 
				
			||||||
github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA=
 | 
					github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA=
 | 
				
			||||||
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
 | 
					github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
 | 
				
			||||||
github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ=
 | 
					github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ=
 | 
				
			||||||
@ -1082,8 +1087,8 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So
 | 
				
			|||||||
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
 | 
					github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
 | 
				
			||||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 | 
					github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 | 
				
			||||||
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
 | 
					github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
 | 
				
			||||||
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
 | 
					github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
 | 
				
			||||||
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
 | 
					github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
 | 
				
			||||||
github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
 | 
					github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
 | 
				
			||||||
github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo=
 | 
					github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo=
 | 
				
			||||||
github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU=
 | 
					github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU=
 | 
				
			||||||
@ -1174,8 +1179,8 @@ github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDd
 | 
				
			|||||||
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48=
 | 
					github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48=
 | 
				
			||||||
github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E=
 | 
					github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E=
 | 
				
			||||||
github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME=
 | 
					github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME=
 | 
				
			||||||
github.com/tidwall/btree v1.6.0 h1:LDZfKfQIBHGHWSwckhXI0RPSXzlo+KYdjK7FWSqOzzg=
 | 
					github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI=
 | 
				
			||||||
github.com/tidwall/btree v1.6.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY=
 | 
					github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY=
 | 
				
			||||||
github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
 | 
					github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
 | 
				
			||||||
github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI=
 | 
					github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI=
 | 
				
			||||||
github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk=
 | 
					github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk=
 | 
				
			||||||
@ -1231,14 +1236,18 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
 | 
				
			|||||||
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
 | 
					go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
 | 
				
			||||||
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
 | 
					go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
 | 
				
			||||||
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
 | 
					go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
 | 
				
			||||||
go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=
 | 
					go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 h1:UNQQKPfTDe1J81ViolILjTKPr9WetKW6uei2hFgJmFs=
 | 
				
			||||||
go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=
 | 
					go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0/go.mod h1:r9vWsPS/3AQItv3OSlEJ/E4mbrhUbbw18meOjArPtKQ=
 | 
				
			||||||
go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=
 | 
					go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 h1:sv9kVfal0MK0wBMCOGr+HeJm9v803BkJxGrk2au7j08=
 | 
				
			||||||
go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=
 | 
					go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0/go.mod h1:SK2UL73Zy1quvRPonmOmRDiWk1KBV3LyIeeIxcEApWw=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=
 | 
					go.opentelemetry.io/otel v1.22.0 h1:xS7Ku+7yTFvDfDraDIJVpw7XPyuHlB9MCiqqX5mcJ6Y=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=
 | 
					go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZVCC6pMI=
 | 
				
			||||||
go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=
 | 
					go.opentelemetry.io/otel/metric v1.22.0 h1:lypMQnGyJYeuYPhOM/bgjbFM6WE44W1/T45er4d8Hhg=
 | 
				
			||||||
go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=
 | 
					go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xCWdXjK8pzFvliY=
 | 
				
			||||||
 | 
					go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=
 | 
				
			||||||
 | 
					go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=
 | 
				
			||||||
 | 
					go.opentelemetry.io/otel/trace v1.22.0 h1:Hg6pPujv0XG9QaVbGOBVHunyuLcCC3jN7WEhPx83XD0=
 | 
				
			||||||
 | 
					go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo=
 | 
				
			||||||
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
 | 
					go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
 | 
				
			||||||
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 | 
					go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 | 
				
			||||||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 | 
					go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 | 
				
			||||||
@ -1391,8 +1400,8 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri
 | 
				
			|||||||
golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
 | 
					golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
 | 
				
			||||||
golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
 | 
					golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
 | 
				
			||||||
golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A=
 | 
					golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A=
 | 
				
			||||||
golang.org/x/oauth2 v0.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ=
 | 
					golang.org/x/oauth2 v0.17.0 h1:6m3ZPmLEFdVxKKWnKq4VqZ60gutO35zm+zrAHVmHyDQ=
 | 
				
			||||||
golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM=
 | 
					golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA=
 | 
				
			||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
@ -1653,8 +1662,8 @@ google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ
 | 
				
			|||||||
google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=
 | 
					google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=
 | 
				
			||||||
google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=
 | 
					google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=
 | 
				
			||||||
google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70=
 | 
					google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70=
 | 
				
			||||||
google.golang.org/api v0.153.0 h1:N1AwGhielyKFaUqH07/ZSIQR3uNPcV7NVw0vj+j4iR4=
 | 
					google.golang.org/api v0.162.0 h1:Vhs54HkaEpkMBdgGdOT2P6F0csGG/vxDS0hWHJzmmps=
 | 
				
			||||||
google.golang.org/api v0.153.0/go.mod h1:3qNJX5eOmhiWYc67jRA/3GsDw97UFb5ivv7Y2PrriAY=
 | 
					google.golang.org/api v0.162.0/go.mod h1:6SulDkfoBIg4NFmCuZ39XeeAgSHCPecfSUuDyYlAHs0=
 | 
				
			||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 | 
					google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 | 
				
			||||||
google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
					google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
				
			||||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
					google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
				
			||||||
@ -1772,12 +1781,12 @@ google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqw
 | 
				
			|||||||
google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM=
 | 
					google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM=
 | 
					google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s=
 | 
					google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917 h1:nz5NESFLZbJGPFxDT/HCn+V1mZ8JGNoY4nUpmW/Y2eg=
 | 
					google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917/go.mod h1:pZqR+glSb11aJ+JQcczCvgf47+duRuzNSKqE8YAQnV0=
 | 
					google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo=
 | 
				
			||||||
google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0 h1:s1w3X6gQxwrLEpxnLd/qXTVLgQE2yXwaOaoa6IlY/+o=
 | 
					google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0=
 | 
				
			||||||
google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0/go.mod h1:CAny0tYF+0/9rmDB9fahA9YLzX3+AEVl1qXbv5hhj6c=
 | 
					google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8=
 | 
				
			||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1 h1:gphdwh0npgs8elJ4T6J+DQJHPVF7RsuJHCfwztUb4J4=
 | 
					google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=
 | 
				
			||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1/go.mod h1:daQN87bsDqDoe316QbbvX60nMoJQa4r6Ds0ZuoAe5yA=
 | 
					google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=
 | 
				
			||||||
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
 | 
					google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
 | 
				
			||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 | 
					google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 | 
				
			||||||
google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
 | 
					google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
 | 
				
			||||||
@ -1819,8 +1828,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu
 | 
				
			|||||||
google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
 | 
					google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
 | 
				
			||||||
google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
 | 
					google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
 | 
				
			||||||
google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
 | 
					google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
 | 
				
			||||||
google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU=
 | 
					google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM=
 | 
				
			||||||
google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM=
 | 
					google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=
 | 
				
			||||||
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
 | 
					google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
 | 
				
			||||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 | 
					google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 | 
				
			||||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 | 
					google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										15
									
								
								third_party/proto/cosmos_proto/cosmos.proto
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								third_party/proto/cosmos_proto/cosmos.proto
									
									
									
									
										vendored
									
									
								
							@ -5,6 +5,12 @@ import "google/protobuf/descriptor.proto";
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
option go_package = "github.com/cosmos/cosmos-proto;cosmos_proto";
 | 
					option go_package = "github.com/cosmos/cosmos-proto;cosmos_proto";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extend google.protobuf.MethodOptions {    
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // method_added_in is used to indicate from which version the method was added.
 | 
				
			||||||
 | 
					    string method_added_in = 93001;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extend google.protobuf.MessageOptions {
 | 
					extend google.protobuf.MessageOptions {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // implements_interface is used to indicate the type name of the interface
 | 
					    // implements_interface is used to indicate the type name of the interface
 | 
				
			||||||
@ -13,6 +19,9 @@ extend google.protobuf.MessageOptions {
 | 
				
			|||||||
    // interfaces. Interfaces should be declared using a declare_interface
 | 
					    // interfaces. Interfaces should be declared using a declare_interface
 | 
				
			||||||
    // file option.
 | 
					    // file option.
 | 
				
			||||||
    repeated string implements_interface = 93001;
 | 
					    repeated string implements_interface = 93001;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // message_added_in is used to indicate from which version the message was added.
 | 
				
			||||||
 | 
					    string message_added_in = 93002;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extend google.protobuf.FieldOptions {
 | 
					extend google.protobuf.FieldOptions {
 | 
				
			||||||
@ -27,6 +36,9 @@ extend google.protobuf.FieldOptions {
 | 
				
			|||||||
    // generators may choose to use this information to map this field to a
 | 
					    // generators may choose to use this information to map this field to a
 | 
				
			||||||
    // language-specific type representing the scalar.
 | 
					    // language-specific type representing the scalar.
 | 
				
			||||||
    string scalar = 93002;
 | 
					    string scalar = 93002;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // field_added_in is used to indicate from which version the field was added.
 | 
				
			||||||
 | 
					    string field_added_in = 93003;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extend google.protobuf.FileOptions {
 | 
					extend google.protobuf.FileOptions {
 | 
				
			||||||
@ -46,6 +58,9 @@ extend google.protobuf.FileOptions {
 | 
				
			|||||||
    // expected that the declaration will be found in a protobuf file named
 | 
					    // expected that the declaration will be found in a protobuf file named
 | 
				
			||||||
    // a/b/scalars.proto in the file descriptor set.
 | 
					    // a/b/scalars.proto in the file descriptor set.
 | 
				
			||||||
    repeated ScalarDescriptor declare_scalar = 793022;
 | 
					    repeated ScalarDescriptor declare_scalar = 793022;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // file_added_in is used to indicate from which the version the file was added.
 | 
				
			||||||
 | 
					    string file_added_in = 793023;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// InterfaceDescriptor describes an interface type to be used with
 | 
					// InterfaceDescriptor describes an interface type to be used with
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										19
									
								
								third_party/proto/ethermint/evm/v1/evm.proto
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								third_party/proto/ethermint/evm/v1/evm.proto
									
									
									
									
										vendored
									
									
								
							@ -18,12 +18,17 @@ message Params {
 | 
				
			|||||||
  repeated int64 extra_eips = 4 [(gogoproto.customname) = "ExtraEIPs", (gogoproto.moretags) = "yaml:\"extra_eips\""];
 | 
					  repeated int64 extra_eips = 4 [(gogoproto.customname) = "ExtraEIPs", (gogoproto.moretags) = "yaml:\"extra_eips\""];
 | 
				
			||||||
  // chain_config defines the EVM chain configuration parameters
 | 
					  // chain_config defines the EVM chain configuration parameters
 | 
				
			||||||
  ChainConfig chain_config = 5 [(gogoproto.moretags) = "yaml:\"chain_config\"", (gogoproto.nullable) = false];
 | 
					  ChainConfig chain_config = 5 [(gogoproto.moretags) = "yaml:\"chain_config\"", (gogoproto.nullable) = false];
 | 
				
			||||||
  // list of allowed eip712 msgs and their types
 | 
					  // eip712_allowed_msgs contains list of allowed eip712 msgs and their types
 | 
				
			||||||
  repeated EIP712AllowedMsg eip712_allowed_msgs = 6
 | 
					  repeated EIP712AllowedMsg eip712_allowed_msgs = 6
 | 
				
			||||||
      [(gogoproto.customname) = "EIP712AllowedMsgs", (gogoproto.nullable) = false];
 | 
					      [(gogoproto.customname) = "EIP712AllowedMsgs", (gogoproto.nullable) = false];
 | 
				
			||||||
  // allow_unprotected_txs defines if replay-protected (i.e non EIP155
 | 
					  // allow_unprotected_txs defines if replay-protected (i.e non EIP155
 | 
				
			||||||
  // signed) transactions can be executed on the state machine.
 | 
					  // signed) transactions can be executed on the state machine.
 | 
				
			||||||
  bool allow_unprotected_txs = 7;
 | 
					  bool allow_unprotected_txs = 7;
 | 
				
			||||||
 | 
					  // enabled_precompiles contains list of hex-encoded evm addresses of enabled precompiled contracts.
 | 
				
			||||||
 | 
					  // Precompile must be registered before it can be enabled.
 | 
				
			||||||
 | 
					  // enabled_precompiles should be sorted in ascending order and unique.
 | 
				
			||||||
 | 
					  // sorting and uniqueness are checked against bytes representation of addresses
 | 
				
			||||||
 | 
					  repeated string enabled_precompiles = 8;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ChainConfig defines the Ethereum ChainConfig parameters using *sdk.Int values
 | 
					// ChainConfig defines the Ethereum ChainConfig parameters using *sdk.Int values
 | 
				
			||||||
@ -246,20 +251,20 @@ message TraceConfig {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// EIP712AllowedMsg stores an allowed legacy msg and its eip712 type.
 | 
					// EIP712AllowedMsg stores an allowed legacy msg and its eip712 type.
 | 
				
			||||||
message EIP712AllowedMsg {
 | 
					message EIP712AllowedMsg {
 | 
				
			||||||
  // msg's proto type name. ie "/cosmos.bank.v1beta1.MsgSend"
 | 
					  // msg_type_url is a msg's proto type name. ie "/cosmos.bank.v1beta1.MsgSend"
 | 
				
			||||||
  string msg_type_url = 1;
 | 
					  string msg_type_url = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // name of the eip712 value type. ie "MsgValueSend"
 | 
					  // msg_value_type_name is a name of the eip712 value type. ie "MsgValueSend"
 | 
				
			||||||
  string msg_value_type_name = 2;
 | 
					  string msg_value_type_name = 2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // types of the msg value
 | 
					  // value_types is a list of msg value types
 | 
				
			||||||
  repeated EIP712MsgAttrType value_types = 3 [(gogoproto.nullable) = false];
 | 
					  repeated EIP712MsgAttrType value_types = 3 [(gogoproto.nullable) = false];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // nested types of the msg value
 | 
					  // nested_types is a list of msg value nested types
 | 
				
			||||||
  repeated EIP712NestedMsgType nested_types = 4 [(gogoproto.nullable) = false];
 | 
					  repeated EIP712NestedMsgType nested_types = 4 [(gogoproto.nullable) = false];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// EIP712MsgType is the eip712 type of a single message.
 | 
					// EIP712NestedMsgType is the eip712 type of a single message.
 | 
				
			||||||
message EIP712NestedMsgType {
 | 
					message EIP712NestedMsgType {
 | 
				
			||||||
  // name of the nested type. ie "Fee", "Coin"
 | 
					  // name of the nested type. ie "Fee", "Coin"
 | 
				
			||||||
  string name = 1;
 | 
					  string name = 1;
 | 
				
			||||||
@ -270,6 +275,8 @@ message EIP712NestedMsgType {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// EIP712MsgAttrType is the eip712 type of a single message attribute.
 | 
					// EIP712MsgAttrType is the eip712 type of a single message attribute.
 | 
				
			||||||
message EIP712MsgAttrType {
 | 
					message EIP712MsgAttrType {
 | 
				
			||||||
 | 
					  // name
 | 
				
			||||||
  string name = 1;
 | 
					  string name = 1;
 | 
				
			||||||
 | 
					  // type
 | 
				
			||||||
  string type = 2;
 | 
					  string type = 2;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user