diff --git a/app/app.go b/app/app.go index 3cc8fec50..5328e4e32 100644 --- a/app/app.go +++ b/app/app.go @@ -55,7 +55,7 @@ import ( v11 "github.com/CosmosContracts/juno/v13/app/upgrades/v11" v12 "github.com/CosmosContracts/juno/v13/app/upgrades/v12" v13p1 "github.com/CosmosContracts/juno/v13/app/upgrades/v13part1" - oracleclient "github.com/CosmosContracts/juno/v13/x/oracle/client" + // oracleclient "github.com/CosmosContracts/juno/v13/x/oracle/client" ) const ( @@ -170,9 +170,9 @@ func getGovProposalHandlers() []govclient.ProposalHandler { upgradeclient.CancelProposalHandler, ibcclientclient.UpdateClientProposalHandler, ibcclientclient.UpgradeProposalHandler, - oracleclient.ProposalHandlerAddTrackingPriceHistory, - oracleclient.ProposalHandlerAddTrackingPriceHistoryWithWhitelist, - oracleclient.ProposalRemoveTrackingPriceHistory, + // oracleclient.ProposalHandlerAddTrackingPriceHistory, + // oracleclient.ProposalHandlerAddTrackingPriceHistoryWithWhitelist, + // oracleclient.ProposalRemoveTrackingPriceHistory, ) return govProposalHandlers diff --git a/app/keepers/keepers.go b/app/keepers/keepers.go index 9cae82651..4fdcaf5ec 100644 --- a/app/keepers/keepers.go +++ b/app/keepers/keepers.go @@ -69,15 +69,15 @@ import ( icahostkeeper "github.com/cosmos/ibc-go/v4/modules/apps/27-interchain-accounts/host/keeper" icahosttypes "github.com/cosmos/ibc-go/v4/modules/apps/27-interchain-accounts/host/types" - feesharekeeper "github.com/CosmosContracts/juno/v13/x/feeshare/keeper" - feesharetypes "github.com/CosmosContracts/juno/v13/x/feeshare/types" - - // ica "github.com/cosmos/ibc-go/v4/modules/apps/27-interchain-accounts" icacontroller "github.com/cosmos/ibc-go/v4/modules/apps/27-interchain-accounts/controller" icacontrollerkeeper "github.com/cosmos/ibc-go/v4/modules/apps/27-interchain-accounts/controller/keeper" icacontrollertypes "github.com/cosmos/ibc-go/v4/modules/apps/27-interchain-accounts/controller/types" + + feesharekeeper "github.com/CosmosContracts/juno/v13/x/feeshare/keeper" + feesharetypes "github.com/CosmosContracts/juno/v13/x/feeshare/types" // intertxkeeper "github.com/cosmos/interchain-accounts/x/inter-tx/keeper" // intertxtypes "github.com/cosmos/interchain-accounts/x/inter-tx/types" + // // oraclekeeper "github.com/CosmosContracts/juno/v13/x/oracle/keeper" // oracletypes "github.com/CosmosContracts/juno/v13/x/oracle/types" ) diff --git a/app/upgrades/v13part2/constants.go b/app/upgrades/v13part2/constants.go deleted file mode 100644 index f00af566b..000000000 --- a/app/upgrades/v13part2/constants.go +++ /dev/null @@ -1,22 +0,0 @@ -package v13 - -import ( - "github.com/CosmosContracts/juno/v13/app/upgrades" - oracletypes "github.com/CosmosContracts/juno/v13/x/oracle/types" - store "github.com/cosmos/cosmos-sdk/store/types" - intertxtypes "github.com/cosmos/interchain-accounts/x/inter-tx/types" -) - -// UpgradeName defines the on-chain upgrade name for the upgrade. -const UpgradeName = "v13-2" - -var Upgrade = upgrades.Upgrade{ - UpgradeName: UpgradeName, - CreateUpgradeHandler: CreateV13_2UpgradeHandler, - StoreUpgrades: store.StoreUpgrades{ - Added: []string{ - oracletypes.ModuleName, - intertxtypes.ModuleName, - }, - }, -} diff --git a/app/upgrades/v13part2/upgrades.go b/app/upgrades/v13part2/upgrades.go deleted file mode 100644 index 208bb7ee8..000000000 --- a/app/upgrades/v13part2/upgrades.go +++ /dev/null @@ -1,61 +0,0 @@ -package v13 - -import ( - "fmt" - "strings" - - "github.com/CosmosContracts/juno/v13/app/keepers" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" - - // oracletypes "github.com/CosmosContracts/juno/v13/x/oracle/types" - upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" -) - -// Returns "ujunox" if the chain is uni, else returns the standard ujuno token denom. -func GetChainsDenomToken(chainID string) string { - if strings.HasPrefix(chainID, "uni-") { - return "ujunox" - } - return "ujuno" -} - -func CreateV13_2UpgradeHandler( - mm *module.Manager, - cfg module.Configurator, - keepers *keepers.AppKeepers, -) upgradetypes.UpgradeHandler { - return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { - // transfer module consensus version has been bumped to 2 - // the above is https://github.com/cosmos/ibc-go/blob/v5.1.0/docs/migrations/v3-to-v4.md - logger := ctx.Logger().With("upgrade", UpgradeName) - - nativeDenom := GetChainsDenomToken(ctx.ChainID()) - logger.Info(fmt.Sprintf("With native denom %s", nativeDenom)) - - // Run migrations - versionMap, err := mm.RunMigrations(ctx, cfg, vm) - - // TODO: must reAdd the keeper in app.go for this to work - // Oracle - // newOracleParams := oracletypes.DefaultParams() - - // // add osmosis to the oracle params - // osmosisDenom := oracletypes.Denom{ - // BaseDenom: "ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE12566649D0C2F97716B8518", - // SymbolDenom: "OSMO", - // Exponent: uint32(6), - // } - - // allDenoms := oracletypes.DefaultWhitelist - // allDenoms = append(allDenoms, osmosisDenom) - - // newOracleParams.Whitelist = allDenoms - // newOracleParams.TwapTrackingList = allDenoms - // logger.Info(fmt.Sprintf("Oracle params set: %s", newOracleParams.String())) - // keepers.OracleKeeper.SetParams(ctx, newOracleParams) - - return versionMap, err - } -} diff --git a/go.mod b/go.mod index 8d88ded3a..9bff94fa1 100644 --- a/go.mod +++ b/go.mod @@ -5,10 +5,8 @@ go 1.19 require ( github.com/CosmWasm/token-factory v0.0.0-00010101000000-000000000000 github.com/CosmWasm/wasmd v0.30.0 - github.com/CosmWasm/wasmvm v1.1.1 github.com/cosmos/cosmos-sdk v0.45.12 github.com/cosmos/ibc-go/v4 v4.3.0 - github.com/cosmos/interchain-accounts v0.2.5 github.com/gogo/protobuf v1.3.3 github.com/golang/protobuf v1.5.2 github.com/gorilla/mux v1.8.0 @@ -23,15 +21,7 @@ require ( github.com/tendermint/tm-db v0.6.8-0.20220506192307-f628bb5dc95b google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef google.golang.org/grpc v1.52.3 - google.golang.org/protobuf v1.28.2-0.20220831092852-f930b1dc76e8 gopkg.in/yaml.v2 v2.4.0 - gopkg.in/yaml.v3 v3.0.1 -) - -require ( - github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect - github.com/iancoleman/orderedmap v0.2.0 // indirect ) require ( @@ -40,6 +30,7 @@ require ( github.com/99designs/keyring v1.2.1 // indirect github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d // indirect + github.com/CosmWasm/wasmvm v1.1.1 // indirect github.com/Microsoft/go-winio v0.6.0 // indirect github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect github.com/Workiva/go-datastructures v1.0.53 // indirect @@ -47,6 +38,7 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect github.com/btcsuite/btcd v0.22.2 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cenkalti/backoff/v4 v4.1.3 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect @@ -54,7 +46,7 @@ require ( github.com/confio/ics23/go v0.9.0 // indirect github.com/containerd/continuity v0.3.0 // indirect github.com/cosmos/btcutil v1.0.5 // indirect - github.com/cosmos/cosmos-proto v1.0.0-beta.1 + github.com/cosmos/cosmos-proto v1.0.0-beta.1 // indirect github.com/cosmos/go-bip39 v1.0.0 github.com/cosmos/gogoproto v1.4.4 github.com/cosmos/gorocksdb v1.2.0 // indirect @@ -63,6 +55,7 @@ require ( github.com/creachadair/taskgroup v0.3.2 // indirect github.com/danieljoos/wincred v1.1.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect github.com/dgraph-io/badger/v3 v3.2103.2 // indirect github.com/dgraph-io/ristretto v0.1.0 // indirect @@ -98,6 +91,7 @@ require ( github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3 // indirect + github.com/iancoleman/orderedmap v0.2.0 // indirect github.com/imdario/mergo v0.3.13 // indirect github.com/improbable-eng/grpc-web v0.15.0 // indirect github.com/inconshreveable/mousetrap v1.0.1 // indirect @@ -156,7 +150,9 @@ require ( golang.org/x/term v0.4.0 // indirect golang.org/x/text v0.6.0 // indirect golang.org/x/tools v0.4.0 // indirect + google.golang.org/protobuf v1.28.2-0.20220831092852-f930b1dc76e8 // indirect gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect nhooyr.io/websocket v1.8.7 // indirect ) diff --git a/go.sum b/go.sum index 3c7cb7f3b..b4023499e 100644 --- a/go.sum +++ b/go.sum @@ -211,7 +211,6 @@ github.com/cosmos/iavl v0.19.4/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONAp github.com/cosmos/ibc-go/v4 v4.3.0 h1:yOzVsyZzsv4XPBux8gq+D0LhZn45yGWKjvT+6Vyo5no= github.com/cosmos/ibc-go/v4 v4.3.0/go.mod h1:CcLvIoi9NNtIbNsxs4KjBGjYhlwqtsmXy1AKARKiMzQ= github.com/cosmos/interchain-accounts v0.2.5 h1:LM2+Z0HhP7k6vGmXL/CC5B6SgMxrYDfMYQciD3o9jt8= -github.com/cosmos/interchain-accounts v0.2.5/go.mod h1:eaQBOsAeGdFxXnv7c5sR5tQnRDJ7LkffsC3L/THpem4= github.com/cosmos/keyring v1.2.0 h1:8C1lBP9xhImmIabyXW4c3vFjjLiBdGCmfLUfeZlV1Yo= github.com/cosmos/keyring v1.2.0/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= github.com/cosmos/ledger-cosmos-go v0.12.2 h1:/XYaBlE2BJxtvpkHiBm97gFGSGmYGKunKyF3nNqAXZA= diff --git a/price-feeder/.goreleaser.yml b/price-feeder/.goreleaser.yml deleted file mode 100644 index edcd90e2b..000000000 --- a/price-feeder/.goreleaser.yml +++ /dev/null @@ -1,51 +0,0 @@ -project_name: price-feeder - -env: - - GO111MODULE=on - -before: - hooks: - - go mod tidy -compat=1.17 - -builds: - - main: ./ - id: "price-feeder" - binary: price-feeder - mod_timestamp: "{{ .CommitTimestamp }}" - flags: - - -trimpath - env: - - CGO_ENABLED=0 - ldflags: - - -s -w -X main.commit={{.Commit}} -X main.date={{ .CommitDate }} -X github.com/CosmosContracts/juno/price-feeder/cmd.Version={{ replace .Version "price-feeder/" "price-feeder-" }} -X github.com/CosmosContracts/juno/price-feeder/cmd.Commit={{ .Commit }} - goos: - - darwin - - linux - goarch: - - amd64 - - arm - - arm64 - -archives: - - format: tar.gz - wrap_in_directory: true - format_overrides: - - goos: windows - format: zip - name_template: '{{ replace .Version "price-feeder/" "price-feeder-" }}-{{ .Os }}-{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}' - files: - - README.md - -release: - disable: false - name_template: "{{ .Tag }}" - -checksum: - name_template: 'SHA256SUMS-{{ replace .Version "price-feeder/" "price-feeder-" }}.txt' - algorithm: sha256 - -snapshot: - name_template: SNAPSHOT-{{ .Commit }} - -changelog: - skip: false diff --git a/price-feeder/Makefile b/price-feeder/Makefile deleted file mode 100644 index 30c171f62..000000000 --- a/price-feeder/Makefile +++ /dev/null @@ -1,65 +0,0 @@ -BRANCH := $(shell git rev-parse --abbrev-ref HEAD) -BUILD_DIR ?= $(CURDIR)/build -COMMIT := $(shell git log -1 --format='%H') -SDK_VERSION := $(shell go list -m github.com/cosmos/cosmos-sdk | sed 's:.* ::') - -all: test-unit install - -.PHONY: all - -############################################################################### -## Version ## -############################################################################### - -ifeq (,$(VERSION)) - VERSION := $(shell git describe --exact-match 2>/dev/null) - # if VERSION is empty, then populate it with branch's name and raw commit hash - ifeq (,$(VERSION)) - VERSION := $(BRANCH)-$(COMMIT) - endif -endif - -############################################################################### -## Build / Install ## -############################################################################### - -ldflags = -X github.com/CosmosContracts/juno/price-feeder/cmd.Version=$(VERSION) \ - -X github.com/CosmosContracts/juno/price-feeder/cmd.Commit=$(COMMIT) \ - -X github.com/CosmosContracts/juno/price-feeder/cmd.SDKVersion=$(SDK_VERSION) - -ifeq ($(LINK_STATICALLY),true) - ldflags += -linkmode=external -extldflags "-Wl,-z,muldefs -static" -endif - -build_tags += $(BUILD_TAGS) - -BUILD_FLAGS := -tags "$(build_tags)" -ldflags '$(ldflags)' - -build: go.sum - @echo "--> Building..." - go build -mod=readonly -o $(BUILD_DIR)/ $(BUILD_FLAGS) ./... - -install: go.sum - @echo "--> Installing..." - go install -mod=readonly $(BUILD_FLAGS) ./... - -tidy: - go mod tidy - -.PHONY: build install - -############################################################################### -## Tests & Linting ## -############################################################################### - -test-unit: - @echo "--> Running tests" - @go test -mod=readonly -race ./... -v - -.PHONY: test-unit - -lint: - @echo "--> Running linter" - @go run github.com/golangci/golangci-lint/cmd/golangci-lint run --fix --timeout=8m - -.PHONY: lint diff --git a/price-feeder/README.md b/price-feeder/README.md deleted file mode 100644 index f76f4c302..000000000 --- a/price-feeder/README.md +++ /dev/null @@ -1,146 +0,0 @@ - -# Oracle Price Feeder - -This is Juno's version of [Umee's price feeder](https://github.com/umee-network/umee/tree/main/price-feeder), intended to work with SDK 0.45.11. - -The `price-feeder` tool is an extension of Juno's `x/oracle` module, both of -which are based on Terra's [x/oracle](https://github.com/terra-money/classic-core/tree/main/x/oracle) and Umee [x/oracle](https://github.com/umee-network/tree/umee/x/oracle) module. -core differences are as follows: - -- All exchange rates must be quoted in USD or USD stablecoins. -- No need or use of reference exchange rates (e.g. Luna). -- No need or use of Tobin tax. -- The `price-feeder` combines both `feeder` and `price-server` into a single - Golang-based application for better UX, testability, and integration. - -## Background - -The `price-feeder` tool is responsible for performing the following: - -1. Fetching and aggregating exchange rate price data from various providers, e.g. - Binance and Osmosis, based on operator configuration. These exchange rates - are exposed via an API and are used to feed into the main oracle process. -2. Taking aggregated exchange rate price data and submitting those exchange rates - on-chain to Juno's `x/oracle` module following Juno's [Oracle](https://github.com/CosmosContracts/juno/tree/main/x/oracle#readme) - specification. - - -## Providers - -The list of current supported providers: - -- [Binance](https://www.binance.com/en) -- [Bitget](https://www.bitget.com/) -- [Coinbase](https://www.coinbase.com/) -- [Crypto](https://crypto.com/) -- [Gate](https://www.gate.io/) -- [Huobi](https://www.huobi.com/en-us/) -- [Kraken](https://www.kraken.com/en-us/) -- [Mexc](https://www.mexc.com/) -- [Okx](https://www.okx.com/) -- [Osmosis](https://app.osmosis.zone/) - - -## Usage - -The `price-feeder` tool runs off of a single configuration file. This configuration -file defines what exchange rates to fetch and what providers to get them from. -In addition, it defines the oracle's keyring and feeder account information. -The keyring's password is defined via environment variables or user input. -More information on the keyring can be found [here](#keyring) -Please see the [example configuration](price-feeder.example.toml) for more details. - -```shell -price-feeder /path/to/price_feeder_config.toml -``` - -## Configuration - -### `telemetry` - -A set of options for the application's telemetry, which is disabled by default. An in-memory sink is the default, but Prometheus is also supported. We use the [cosmos sdk telemetry package](https://github.com/cosmos/cosmos-sdk/blob/3689d6f41ad8afa6e0f9b4ecb03b4d7f2d3a9e94/docs/docs/core/09-telemetry.md). - -### `deviation` - -Deviation allows validators to set a custom amount of standard deviations around the median which is helpful if any providers become faulty. It should be noted that the default for this option is 1 standard deviation. - -### `provider_endpoints` - -The provider_endpoints option enables validators to setup their own API endpoints for a given provider. - -### `server` - -The `server` section contains configuration pertaining to the API served by the -`price-feeder` process such the listening address and various HTTP timeouts. - -### `currency_pairs` - -The `currency_pairs` sections contains one or more exchange rates along with the -providers from which to get market data from. It is important to note that the -providers supplied in each `currency_pairs` must support the given exchange rate. - -For example, to get multiple price points on ATOM, you could define `currency_pairs` -as follows: - -```toml -[[currency_pairs]] -base = "ATOM" -providers = [ - "binance", -] -quote = "USDT" - -[[currency_pairs]] -base = "ATOM" -providers = [ - "kraken", - "osmosis", -] -quote = "USD" -``` - -Providing multiple providers is beneficial in case any provider fails to return -market data. Prices per exchange rate are submitted on-chain via pre-vote and -vote messages using a time-weighted average price (TVWAP). - -### `provider_min_override` - -At startup the amount of possible providers for a currency is checked by querying the -CoinGecko API to enforce an acceptable minimum providers for a given currency pair. If -this request fails and `provider_min_override` is set to true, the minimum is not enforced -and the `price-feeder` is allowed to run irrespective of how many providers are provided -for a given currency pair. `provider_min_override` will not take effect if CoinGecko -requests are successful. - -### `account` - -The `account` section contains the oracle's feeder and validator account information. -These are used to sign and populate data in pre-vote and vote oracle messages. - -### `keyring` - -The `keyring` section contains Keyring related material used to fetch the key pair -associated with the oracle account that signs pre-vote and vote oracle messages. - -### `rpc` - -The `rpc` section contains the Tendermint and Cosmos application gRPC endpoints. -These endpoints are used to query for on-chain data that pertain to oracle -functionality and for broadcasting signed pre-vote and vote oracle messages. - -## Keyring - -Our keyring must be set up to sign transactions before running the price feeder. -Additional info on the different keyring modes is available [here](https://docs.cosmos.network/v0.46/run-node/keyring.html). -**Please note that the `test` and `memory` modes are only for testing purposes.** -**Do not use these modes for running the price feeder against mainnet.** - -### Setup - -The keyring `dir` and `backend` are defined in the config file. -You may use the `PRICE_FEEDER_PASS` environment variable to set up the keyring password. - -Ex : -`export PRICE_FEEDER_PASS=keyringPassword` - -If this environment variable is not set, the price feeder will prompt the user for input. diff --git a/price-feeder/cmd/price-feeder.go b/price-feeder/cmd/price-feeder.go deleted file mode 100644 index d524d32c1..000000000 --- a/price-feeder/cmd/price-feeder.go +++ /dev/null @@ -1,309 +0,0 @@ -package cmd - -import ( - "context" - "fmt" - "io" - "net/http" - "os" - "os/signal" - "strings" - "syscall" - "time" - - "github.com/mitchellh/mapstructure" - - "github.com/gorilla/mux" - "github.com/rs/zerolog" - "github.com/spf13/cobra" - "golang.org/x/sync/errgroup" - "golang.org/x/term" - - "github.com/CosmosContracts/juno/price-feeder/config" - "github.com/CosmosContracts/juno/price-feeder/oracle" - "github.com/CosmosContracts/juno/price-feeder/oracle/client" - "github.com/CosmosContracts/juno/price-feeder/oracle/provider" - v1 "github.com/CosmosContracts/juno/price-feeder/router/v1" - "github.com/CosmosContracts/juno/v13/app" - "github.com/cosmos/cosmos-sdk/telemetry" - sdk "github.com/cosmos/cosmos-sdk/types" -) - -const ( - logLevelJSON = "json" - logLevelText = "text" - - flagLogLevel = "log-level" - flagLogFormat = "log-format" - - envVariablePass = "PRICE_FEEDER_PASS" -) - -var rootCmd = &cobra.Command{ - Use: "price-feeder [config-file]", - Args: cobra.ExactArgs(1), - Short: "price-feeder is a side-car process for providing Juno's on-chain oracle with price data", - Long: `A side-car process that Juno validators must run in order to provide -Juno's on-chain price oracle with price information. The price-feeder performs -two primary functions. First, it is responsible for obtaining price information -from various reliable data sources, e.g. exchanges, and exposing this data via -an API. Secondly, the price-feeder consumes this data and periodically submits -vote and prevote messages following the oracle voting procedure.`, - RunE: priceFeederCmdHandler, -} - -func init() { - rootCmd.PersistentFlags().String(flagLogLevel, zerolog.InfoLevel.String(), "logging level") - rootCmd.PersistentFlags().String(flagLogFormat, logLevelText, "logging format; must be either json or text") - - rootCmd.AddCommand(getVersionCmd()) -} - -// Execute adds all child commands to the root command and sets flags appropriately. -// This is called by main.main(). It only needs to happen once to the rootCmd. -func Execute() { - if err := rootCmd.Execute(); err != nil { - fmt.Println(err) - os.Exit(1) - } -} - -func priceFeederCmdHandler(cmd *cobra.Command, args []string) error { - logLvlStr, err := cmd.Flags().GetString(flagLogLevel) - if err != nil { - return err - } - - logLvl, err := zerolog.ParseLevel(logLvlStr) - if err != nil { - return err - } - - logFormatStr, err := cmd.Flags().GetString(flagLogFormat) - if err != nil { - return err - } - - var logWriter io.Writer - switch strings.ToLower(logFormatStr) { - case logLevelJSON: - logWriter = os.Stderr - - case logLevelText: - logWriter = zerolog.ConsoleWriter{Out: os.Stderr} - - default: - return fmt.Errorf("invalid logging format: %s", logFormatStr) - } - - logger := zerolog.New(logWriter).Level(logLvl).With().Timestamp().Logger() - - cfg, err := config.ParseConfig(args[0]) - if err != nil { - return err - } - - app.SetAddressPrefixes() - - err = config.CheckProviderMins(cmd.Context(), logger, cfg) - if err != nil { - return err - } - - ctx, cancel := context.WithCancel(cmd.Context()) - g, ctx := errgroup.WithContext(ctx) - - // listen for and trap any OS signal to gracefully shutdown and exit - trapSignal(cancel, logger) - - rpcTimeout, err := time.ParseDuration(cfg.RPC.RPCTimeout) - if err != nil { - return fmt.Errorf("failed to parse RPC timeout: %w", err) - } - - // Gather pass via env variable || std input - keyringPass, err := getKeyringPassword(cfg.Keyring.Backend) - if err != nil { - return err - } - - oracleClient, err := client.NewOracleClient( - ctx, - logger, - cfg.Account.ChainID, - cfg.Keyring.Backend, - cfg.Keyring.Dir, - keyringPass, - cfg.RPC.TMRPCEndpoint, - rpcTimeout, - cfg.Account.Address, - cfg.Account.Validator, - cfg.RPC.GRPCEndpoint, - cfg.GasAdjustment, - cfg.GasPrice, - cfg.FeeGrantAddress, - ) - if err != nil { - return err - } - - providerTimeout, err := time.ParseDuration(cfg.ProviderTimeout) - if err != nil { - return fmt.Errorf("failed to parse provider timeout: %w", err) - } - - deviations := make(map[string]sdk.Dec, len(cfg.Deviations)) - for _, deviation := range cfg.Deviations { - threshold, err := sdk.NewDecFromStr(deviation.Threshold) - if err != nil { - return err - } - deviations[deviation.Base] = threshold - } - - endpoints := make(map[provider.Name]provider.Endpoint, len(cfg.ProviderEndpoints)) - for _, endpoint := range cfg.ProviderEndpoints { - endpoints[endpoint.Name] = endpoint - } - - oracle := oracle.New( - logger, - oracleClient, - cfg.CurrencyPairs, - providerTimeout, - deviations, - endpoints, - ) - - telemetryCfg := telemetry.Config{} - err = mapstructure.Decode(cfg.Telemetry, &telemetryCfg) - if err != nil { - return err - } - metrics, err := telemetry.New(telemetryCfg) - if err != nil { - return err - } - - g.Go(func() error { - // start the process that observes and publishes exchange prices - return startPriceFeeder(ctx, logger, cfg, oracle, metrics) - }) - g.Go(func() error { - // start the process that calculates oracle prices and votes - return startPriceOracle(ctx, logger, oracle) - }) - - // Block main process until all spawned goroutines have gracefully exited and - // signal has been captured in the main process or if an error occurs. - return g.Wait() -} - -func getKeyringPassword(keyringBackend string) (string, error) { - if keyringBackend == "test" { - return "", nil - } - - pass := os.Getenv(envVariablePass) - if pass == "" { - fmt.Print("Enter keyring password: ") - bytePassword, err := term.ReadPassword(syscall.Stdin) - if err != nil { - return "", err - } - pass = string(bytePassword) - } - return pass, nil -} - -// trapSignal will listen for any OS signal and invoke Done on the main -// WaitGroup allowing the main process to gracefully exit. -func trapSignal(cancel context.CancelFunc, logger zerolog.Logger) { - sigCh := make(chan os.Signal, 1) - - signal.Notify(sigCh, syscall.SIGTERM) - signal.Notify(sigCh, syscall.SIGINT) - - go func() { - sig := <-sigCh - logger.Info().Str("signal", sig.String()).Msg("caught signal; shutting down...") - cancel() - }() -} - -func startPriceFeeder( - ctx context.Context, - logger zerolog.Logger, - cfg config.Config, - oracle *oracle.Oracle, - metrics *telemetry.Metrics, -) error { - rtr := mux.NewRouter() - v1Router := v1.New(logger, cfg, oracle, metrics) - v1Router.RegisterRoutes(rtr, v1.APIPathPrefix) - - writeTimeout, err := time.ParseDuration(cfg.Server.WriteTimeout) - if err != nil { - return err - } - readTimeout, err := time.ParseDuration(cfg.Server.ReadTimeout) - if err != nil { - return err - } - - srvErrCh := make(chan error, 1) - srv := &http.Server{ - Handler: rtr, - Addr: cfg.Server.ListenAddr, - WriteTimeout: writeTimeout, - ReadTimeout: readTimeout, - ReadHeaderTimeout: readTimeout, - } - - go func() { - logger.Info().Str("listen_addr", cfg.Server.ListenAddr).Msg("starting price-feeder server...") - srvErrCh <- srv.ListenAndServe() - }() - - for { - select { - case <-ctx.Done(): - shutdownCtx, cancel := context.WithTimeout(ctx, 15*time.Second) - defer cancel() - - logger.Info().Str("listen_addr", cfg.Server.ListenAddr).Msg("shutting down price-feeder server...") - if err := srv.Shutdown(shutdownCtx); err != nil { - logger.Error().Err(err).Msg("failed to gracefully shutdown price-feeder server") - return err - } - - return nil - - case err := <-srvErrCh: - logger.Error().Err(err).Msg("failed to start price-feeder server") - return err - } - } -} - -func startPriceOracle(ctx context.Context, logger zerolog.Logger, oracle *oracle.Oracle) error { - srvErrCh := make(chan error, 1) - - go func() { - logger.Info().Msg("starting price-feeder oracle...") - srvErrCh <- oracle.Start(ctx) - }() - - for { - select { - case <-ctx.Done(): - logger.Info().Msg("shutting down price-feeder oracle...") - return nil - - case err := <-srvErrCh: - logger.Err(err).Msg("error starting the price-feeder oracle") - oracle.Stop() - return err - } - } -} diff --git a/price-feeder/cmd/version.go b/price-feeder/cmd/version.go deleted file mode 100644 index debe4fef7..000000000 --- a/price-feeder/cmd/version.go +++ /dev/null @@ -1,70 +0,0 @@ -package cmd - -import ( - "encoding/json" - "fmt" - "runtime" - - "github.com/spf13/cobra" - "gopkg.in/yaml.v3" -) - -const ( - flagFormat = "format" -) - -var ( - // Version defines the application version (defined at compile time) - Version = "" - - // Commit defines the application commit hash (defined at compile time) - Commit = "" - - // SDKVersion defines the sdk version (defined at compile time) - SDKVersion = "" - - versionFormat string -) - -type versionInfo struct { - Version string `json:"version" yaml:"version"` - Commit string `json:"commit" yaml:"commit"` - SDK string `json:"sdk" yaml:"sdk"` - Go string `json:"go" yaml:"go"` -} - -func getVersionCmd() *cobra.Command { - versionCmd := &cobra.Command{ - Use: "version", - Short: "Print binary version information", - RunE: func(cmd *cobra.Command, args []string) error { - verInfo := versionInfo{ - Version: Version, - Commit: Commit, - SDK: SDKVersion, - Go: fmt.Sprintf("%s %s/%s", runtime.Version(), runtime.GOOS, runtime.GOARCH), - } - - var bz []byte - - var err error - switch versionFormat { - case "json": - bz, err = json.Marshal(verInfo) - - default: - bz, err = yaml.Marshal(&verInfo) - } - if err != nil { - return err - } - - _, err = fmt.Println(string(bz)) - return err - }, - } - - versionCmd.Flags().StringVar(&versionFormat, flagFormat, "text", "Print the version in the given format (text|json)") - - return versionCmd -} diff --git a/price-feeder/config.example.toml b/price-feeder/config.example.toml deleted file mode 100644 index cf502666e..000000000 --- a/price-feeder/config.example.toml +++ /dev/null @@ -1,129 +0,0 @@ -gas_adjustment = 1.5 -provider_min_override = true -gas_price = "0.0001stake" -fee_grant_address = "" - -[server] -listen_addr = "0.0.0.0:7171" -read_timeout = "20s" -verbose_cors = true -write_timeout = "20s" - -[[deviation_thresholds]] -base = "USDT" -threshold = "1.5" - -[[deviation_thresholds]] -base = "ATOM" -threshold = "1.5" - -[[deviation_thresholds]] -base = "JUNO" -threshold = "1.5" - -[[deviation_thresholds]] -base = "USDC" -threshold = "1.5" - -[[currency_pairs]] -base = "USDT" -providers = [ - "coinbase", - "crypto" -] -quote = "USD" - -[[currency_pairs]] -base = "ATOM" -providers = [ - "okx", -] -quote = "USDT" - -[[currency_pairs]] -base = "ATOM" -providers = [ - "kraken", - "osmosis", -] -quote = "USD" - -[[currency_pairs]] -base = "JUNO" -providers = [ - "osmosis", -] -quote = "USD" - -[[currency_pairs]] -base = "JUNO" -providers = [ - "juno", -] -quote = "USD" - -[[currency_pairs]] -base = "JUNO" -providers = [ - "bitget", -] -quote = "USDT" - -[[currency_pairs]] -base = "JUNO" -providers = [ - "bitget", -] -quote = "USDT" - -[[currency_pairs]] -base = "OSMO" -providers = [ - "osmosis", -] -quote = "USD" - -[[currency_pairs]] -base = "OSMO" -providers = [ - "bitget", -] -quote = "USDT" - -[[currency_pairs]] -base = "USDC" -providers = [ - "okx", - "bitget", - "kraken", -] -quote = "USDT" - -[account] -address = "juno1w20tfhnehc33rgtm9tg8gdtea0svn7twfnyqee" -chain_id = "test-1" -validator = "junovaloper1w20tfhnehc33rgtm9tg8gdtea0svn7twkwj0zq" -prefix = "juno" - -[keyring] -backend = "test" -dir = "~/.juno" - -[rpc] -grpc_endpoint = "localhost:9090" -rpc_timeout = "100ms" -tmrpc_endpoint = "http://localhost:26657" - -[telemetry] -enable-hostname = true -enable-hostname-label = true -enable-service-label = true -enabled = true -global-labels = [["chain_id", "test-1"]] -service-name = "price-feeder" -prometheus-retention-time = 100 - -[[provider_endpoints]] -name = "binance" -rest = "https://api1.binance.com" -websocket = "fstream.binance.com:443" \ No newline at end of file diff --git a/price-feeder/config/config.go b/price-feeder/config/config.go deleted file mode 100644 index ec1590c06..000000000 --- a/price-feeder/config/config.go +++ /dev/null @@ -1,287 +0,0 @@ -package config - -import ( - "context" - "errors" - "fmt" - "strings" - "time" - - "github.com/CosmosContracts/juno/price-feeder/oracle/provider" - "github.com/cosmos/cosmos-sdk/telemetry" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/go-playground/validator/v10" - "github.com/rs/zerolog" - "github.com/spf13/viper" -) - -const ( - DenomUSD = "USD" - - defaultListenAddr = "0.0.0.0:7171" - defaultSrvWriteTimeout = 15 * time.Second - defaultSrvReadTimeout = 15 * time.Second - defaultProviderTimeout = 100 * time.Millisecond -) - -var ( - validate = validator.New() - - // ErrEmptyConfigPath defines a sentinel error for an empty config path. - ErrEmptyConfigPath = errors.New("empty configuration file path") - - // SupportedProviders defines a lookup table of all the supported currency API - // providers. - SupportedProviders = map[provider.Name]struct{}{ - provider.ProviderKraken: {}, - provider.ProviderBinance: {}, - provider.ProviderOsmosis: {}, - provider.ProviderJuno: {}, - provider.ProviderOkx: {}, - provider.ProviderHuobi: {}, - provider.ProviderGate: {}, - provider.ProviderCoinbase: {}, - provider.ProviderBitget: {}, - provider.ProviderMexc: {}, - provider.ProviderCrypto: {}, - provider.ProviderMock: {}, - } - - // maxDeviationThreshold is the maxmimum allowed amount of standard - // deviations which validators are able to set for a given asset. - maxDeviationThreshold = sdk.MustNewDecFromStr("3.0") - - // SupportedQuotes defines a lookup table for which assets we support - // using as quotes. - SupportedQuotes = map[string]struct{}{ - DenomUSD: {}, - "USDC": {}, - "USDT": {}, - "DAI": {}, - "BTC": {}, - "ETH": {}, - } -) - -type ( - // Config defines all necessary price-feeder configuration parameters. - Config struct { - Server Server `mapstructure:"server"` - CurrencyPairs []CurrencyPair `mapstructure:"currency_pairs" validate:"required,gt=0,dive,required"` - Deviations []Deviation `mapstructure:"deviation_thresholds"` - Account Account `mapstructure:"account" validate:"required,gt=0,dive,required"` - Keyring Keyring `mapstructure:"keyring" validate:"required,gt=0,dive,required"` - RPC RPC `mapstructure:"rpc" validate:"required,gt=0,dive,required"` - Telemetry telemetry.Config `mapstructure:"telemetry"` - GasAdjustment float64 `mapstructure:"gas_adjustment" validate:"required"` - ProviderTimeout string `mapstructure:"provider_timeout"` - ProviderMinOverride bool `mapstructure:"provider_min_override"` - ProviderEndpoints []provider.Endpoint `mapstructure:"provider_endpoints" validate:"dive"` - GasPrice string `mapstructure:"gas_price"` - FeeGrantAddress string `mapstructure:"fee_grant_address"` - } - - // Server defines the API server configuration. - Server struct { - ListenAddr string `mapstructure:"listen_addr"` - WriteTimeout string `mapstructure:"write_timeout"` - ReadTimeout string `mapstructure:"read_timeout"` - VerboseCORS bool `mapstructure:"verbose_cors"` - AllowedOrigins []string `mapstructure:"allowed_origins"` - } - - // CurrencyPair defines a price quote of the exchange rate for two different - // currencies and the supported providers for getting the exchange rate. - CurrencyPair struct { - Base string `mapstructure:"base" validate:"required"` - Quote string `mapstructure:"quote" validate:"required"` - Providers []provider.Name `mapstructure:"providers" validate:"required,gt=0,dive,required"` - } - - // Deviation defines a maximum amount of standard deviations that a given asset can - // be from the median without being filtered out before voting. - Deviation struct { - Base string `mapstructure:"base" validate:"required"` - Threshold string `mapstructure:"threshold" validate:"required"` - } - - // Account defines account related configuration that is related to the JUNO - // network and transaction signing functionality. - Account struct { - ChainID string `mapstructure:"chain_id" validate:"required"` - Address string `mapstructure:"address" validate:"required"` - Validator string `mapstructure:"validator" validate:"required"` - } - - // Keyring defines the required JUNO keyring configuration. - Keyring struct { - Backend string `mapstructure:"backend" validate:"required"` - Dir string `mapstructure:"dir" validate:"required"` - } - - // RPC defines RPC configuration of both the JUNO gRPC and Tendermint nodes. - RPC struct { - TMRPCEndpoint string `mapstructure:"tmrpc_endpoint" validate:"required"` - GRPCEndpoint string `mapstructure:"grpc_endpoint" validate:"required"` - RPCTimeout string `mapstructure:"rpc_timeout" validate:"required"` - } -) - -// telemetryValidation is custom validation for the Telemetry struct. -func telemetryValidation(sl validator.StructLevel) { - tel := sl.Current().Interface().(telemetry.Config) - - if tel.Enabled && (len(tel.GlobalLabels) == 0 || len(tel.ServiceName) == 0) { - sl.ReportError(tel.Enabled, "enabled", "Enabled", "enabledNoOptions", "") - } -} - -// endpointValidation is custom validation for the ProviderEndpoint struct. -func endpointValidation(sl validator.StructLevel) { - endpoint := sl.Current().Interface().(provider.Endpoint) - - if len(endpoint.Name) < 1 || len(endpoint.Rest) < 1 || len(endpoint.Websocket) < 1 { - sl.ReportError(endpoint, "endpoint", "Endpoint", "unsupportedEndpointType", "") - } - if _, ok := SupportedProviders[endpoint.Name]; !ok { - sl.ReportError(endpoint.Name, "name", "Name", "unsupportedEndpointProvider", "") - } -} - -// Validate returns an error if the Config object is invalid. -func (c Config) Validate() error { - validate.RegisterStructValidation(telemetryValidation, telemetry.Config{}) - validate.RegisterStructValidation(endpointValidation, provider.Endpoint{}) - return validate.Struct(c) -} - -// ParseConfig attempts to read and parse configuration from the given file path. -// An error is returned if reading or parsing the config fails. -func ParseConfig(configPath string) (Config, error) { - var cfg Config - - if configPath == "" { - return cfg, ErrEmptyConfigPath - } - - viper.AutomaticEnv() - viper.SetConfigFile(configPath) - - if err := viper.ReadInConfig(); err != nil { - return cfg, fmt.Errorf("failed to read config: %w", err) - } - - if err := viper.Unmarshal(&cfg); err != nil { - return cfg, fmt.Errorf("failed to decode config: %w", err) - } - - if cfg.Server.ListenAddr == "" { - cfg.Server.ListenAddr = defaultListenAddr - } - if len(cfg.Server.WriteTimeout) == 0 { - cfg.Server.WriteTimeout = defaultSrvWriteTimeout.String() - } - if len(cfg.Server.ReadTimeout) == 0 { - cfg.Server.ReadTimeout = defaultSrvReadTimeout.String() - } - if len(cfg.ProviderTimeout) == 0 { - cfg.ProviderTimeout = defaultProviderTimeout.String() - } - - pairs := make(map[string]map[provider.Name]struct{}) - coinQuotes := make(map[string]struct{}) - for _, cp := range cfg.CurrencyPairs { - if _, ok := pairs[cp.Base]; !ok { - pairs[cp.Base] = make(map[provider.Name]struct{}) - } - if strings.ToUpper(cp.Quote) != DenomUSD { - coinQuotes[cp.Quote] = struct{}{} - } - if _, ok := SupportedQuotes[strings.ToUpper(cp.Quote)]; !ok { - return cfg, fmt.Errorf("unsupported quote: %s", cp.Quote) - } - - for _, provider := range cp.Providers { - if _, ok := SupportedProviders[provider]; !ok { - return cfg, fmt.Errorf("unsupported provider: %s", provider) - } - pairs[cp.Base][provider] = struct{}{} - } - } - - // Use coinQuotes to ensure that any quotes can be converted to USD. - for quote := range coinQuotes { - for index, pair := range cfg.CurrencyPairs { - if pair.Base == quote && pair.Quote == DenomUSD { - break - } - if index == len(cfg.CurrencyPairs)-1 { - return cfg, fmt.Errorf("all non-usd quotes require a conversion rate feed") - } - } - } - - gatePairs := []string{} - for base, providers := range pairs { - if _, ok := providers[provider.ProviderGate]; ok { - gatePairs = append(gatePairs, base) - } - } - if len(gatePairs) > 1 { - return cfg, fmt.Errorf("gate provider does not support multiple pairs: %v", gatePairs) - } - - for _, deviation := range cfg.Deviations { - threshold, err := sdk.NewDecFromStr(deviation.Threshold) - if err != nil { - return cfg, fmt.Errorf("deviation thresholds must be numeric: %w", err) - } - - if threshold.GT(maxDeviationThreshold) { - return cfg, fmt.Errorf("deviation thresholds must not exceed 3.0") - } - } - - return cfg, cfg.Validate() -} - -// CheckProviderMins starts the currency provider tracker to check the amount of -// providers available for a currency by querying CoinGecko's API. It will enforce -// a provider minimum for a given currency based on its available providers. -func CheckProviderMins(ctx context.Context, logger zerolog.Logger, cfg Config) error { - currencyProviderTracker, err := NewCurrencyProviderTracker(ctx, logger, cfg.CurrencyPairs...) - if err != nil { - logger.Error().Err(err).Msg("failed to start currency provider tracker") - // If currency tracker errors out and override flag is set, the price-feeder - // will run without enforcing provider minimums. - if cfg.ProviderMinOverride { - return nil - } - } - - pairs := make(map[string]map[provider.Name]struct{}) - for _, cp := range cfg.CurrencyPairs { - if _, ok := pairs[cp.Base]; !ok { - pairs[cp.Base] = make(map[provider.Name]struct{}) - } - for _, provider := range cp.Providers { - pairs[cp.Base][provider] = struct{}{} - } - } - - for base, providers := range pairs { - // If currency provider tracker errored, default to three providers as - // the minimum. - var minProviders int - if currencyProviderTracker != nil { - minProviders = currencyProviderTracker.CurrencyProviderMin[base] - } else { - minProviders = 2 - } - if _, ok := pairs[base][provider.ProviderMock]; !ok && len(providers) < minProviders { - return fmt.Errorf("must have at least %d providers for %s", minProviders, base) - } - } - - return nil -} diff --git a/price-feeder/config/config_test.go b/price-feeder/config/config_test.go deleted file mode 100644 index f30252a66..000000000 --- a/price-feeder/config/config_test.go +++ /dev/null @@ -1,758 +0,0 @@ -package config_test - -import ( - "context" - "os" - "testing" - - "github.com/CosmosContracts/juno/price-feeder/config" - "github.com/CosmosContracts/juno/price-feeder/oracle/provider" - "github.com/cosmos/cosmos-sdk/telemetry" - "github.com/rs/zerolog" - "github.com/stretchr/testify/require" -) - -func TestValidate(t *testing.T) { - validConfig := func() config.Config { - return config.Config{ - Server: config.Server{ - ListenAddr: "0.0.0.0:7171", - VerboseCORS: false, - AllowedOrigins: []string{}, - }, - CurrencyPairs: []config.CurrencyPair{ - {Base: "ATOM", Quote: "USDT", Providers: []provider.Name{provider.ProviderKraken}}, - }, - Account: config.Account{ - Address: "fromaddr", - Validator: "valaddr", - ChainID: "chain-id", - }, - Keyring: config.Keyring{ - Backend: "test", - Dir: "/Users/username/.juno", - }, - RPC: config.RPC{ - TMRPCEndpoint: "http://localhost:26657", - GRPCEndpoint: "localhost:9090", - RPCTimeout: "100ms", - }, - Telemetry: telemetry.Config{ - ServiceName: "price-feeder", - Enabled: true, - EnableHostname: true, - EnableHostnameLabel: true, - EnableServiceLabel: true, - GlobalLabels: make([][]string, 1), - PrometheusRetentionTime: 120, - }, - GasAdjustment: 1.5, - } - } - emptyPairs := validConfig() - emptyPairs.CurrencyPairs = []config.CurrencyPair{} - - invalidBase := validConfig() - invalidBase.CurrencyPairs = []config.CurrencyPair{ - {Base: "", Quote: "USDT", Providers: []provider.Name{provider.ProviderKraken}}, - } - - invalidQuote := validConfig() - invalidQuote.CurrencyPairs = []config.CurrencyPair{ - {Base: "ATOM", Quote: "", Providers: []provider.Name{provider.ProviderKraken}}, - } - - emptyProviders := validConfig() - emptyProviders.CurrencyPairs = []config.CurrencyPair{ - {Base: "ATOM", Quote: "USDT", Providers: []provider.Name{}}, - } - - invalidEndpoints := validConfig() - invalidEndpoints.ProviderEndpoints = []provider.Endpoint{ - { - Name: provider.ProviderBinance, - }, - } - - invalidEndpointsProvider := validConfig() - invalidEndpointsProvider.ProviderEndpoints = []provider.Endpoint{ - { - Name: "foo", - Rest: "bar", - Websocket: "baz", - }, - } - - testCases := []struct { - name string - cfg config.Config - expectErr bool - }{ - { - "valid config", - validConfig(), - false, - }, - { - "empty pairs", - emptyPairs, - true, - }, - { - "invalid base", - invalidBase, - true, - }, - { - "invalid quote", - invalidQuote, - true, - }, - { - "empty providers", - emptyProviders, - true, - }, - { - "invalid endpoints", - invalidEndpoints, - true, - }, - { - "invalid endpoint provider", - invalidEndpointsProvider, - true, - }, - } - - for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - require.Equal(t, tc.cfg.Validate() != nil, tc.expectErr) - }) - } -} - -func TestParseConfig_Valid(t *testing.T) { - tmpFile, err := os.CreateTemp("", "price-feeder*.toml") - require.NoError(t, err) - defer os.Remove(tmpFile.Name()) - - content := []byte(` -gas_adjustment = 1.5 - -[server] -listen_addr = "0.0.0.0:99999" -read_timeout = "20s" -verbose_cors = true -write_timeout = "20s" - -[[currency_pairs]] -base = "ATOM" -quote = "USDT" -providers = [ - "kraken", - "binance", - "huobi" -] - -[[currency_pairs]] -base = "JUNO" -quote = "USDT" -providers = [ - "kraken", - "binance", - "huobi" -] - -[[currency_pairs]] -base = "USDT" -quote = "USD" -providers = [ - "kraken", - "binance", - "huobi" -] - -[account] -address = "juno15x87cdlt9ed0xhgtsdutdec3njg42q3a9vw7fn" -chain_id = "test-1" -validator = "junovaloper15x87cdlt9ed0xhgtsdutdec3njg42q3a63c3j2" - -[keyring] -backend = "test" -dir = "/Users/username/.juno" -pass = "keyringPassword" - -[rpc] -tmrpc_endpoint = "http://localhost:26657" -grpc_endpoint = "localhost:9090" -rpc_timeout = "100ms" - -[telemetry] -service-name = "price-feeder" -enabled = true -enable-hostname = true -enable-hostname-label = true -enable-service-label = true -prometheus-retention = 120 -global-labels = [["chain-id", "juno-local-testnet"]] -`) - _, err = tmpFile.Write(content) - require.NoError(t, err) - - cfg, err := config.ParseConfig(tmpFile.Name()) - require.NoError(t, err) - - require.Equal(t, "0.0.0.0:99999", cfg.Server.ListenAddr) - require.Equal(t, "20s", cfg.Server.WriteTimeout) - require.Equal(t, "20s", cfg.Server.ReadTimeout) - require.True(t, cfg.Server.VerboseCORS) - require.Len(t, cfg.CurrencyPairs, 3) - require.Equal(t, "ATOM", cfg.CurrencyPairs[0].Base) - require.Equal(t, "USDT", cfg.CurrencyPairs[0].Quote) - require.Len(t, cfg.CurrencyPairs[0].Providers, 3) - require.Equal(t, provider.ProviderKraken, cfg.CurrencyPairs[0].Providers[0]) - require.Equal(t, provider.ProviderBinance, cfg.CurrencyPairs[0].Providers[1]) -} - -func TestParseConfig_Valid_NoTelemetry(t *testing.T) { - tmpFile, err := os.CreateTemp("", "price-feeder*.toml") - require.NoError(t, err) - defer os.Remove(tmpFile.Name()) - - content := []byte(` -gas_adjustment = 1.5 - -[server] -listen_addr = "0.0.0.0:99999" -read_timeout = "20s" -verbose_cors = true -write_timeout = "20s" - -[[currency_pairs]] -base = "ATOM" -quote = "USDT" -providers = [ - "kraken", - "binance", - "huobi" -] - -[[currency_pairs]] -base = "JUNO" -quote = "USDT" -providers = [ - "kraken", - "binance", - "huobi" -] - -[[currency_pairs]] -base = "USDT" -quote = "USD" -providers = [ - "kraken", - "binance", - "huobi" -] - -[account] -address = "juno15x87cdlt9ed0xhgtsdutdec3njg42q3a9vw7fn" -chain_id = "test-1" -validator = "junovaloper15x87cdlt9ed0xhgtsdutdec3njg42q3a63c3j2" - -[keyring] -backend = "test" -dir = "/Users/username/.juno" -pass = "keyringPassword" - -[rpc] -tmrpc_endpoint = "http://localhost:26657" -grpc_endpoint = "localhost:9090" -rpc_timeout = "100ms" - -[telemetry] -enabled = false -`) - _, err = tmpFile.Write(content) - require.NoError(t, err) - - cfg, err := config.ParseConfig(tmpFile.Name()) - require.NoError(t, err) - - require.Equal(t, "0.0.0.0:99999", cfg.Server.ListenAddr) - require.Equal(t, "20s", cfg.Server.WriteTimeout) - require.Equal(t, "20s", cfg.Server.ReadTimeout) - require.True(t, cfg.Server.VerboseCORS) - require.Len(t, cfg.CurrencyPairs, 3) - require.Equal(t, "ATOM", cfg.CurrencyPairs[0].Base) - require.Equal(t, "USDT", cfg.CurrencyPairs[0].Quote) - require.Len(t, cfg.CurrencyPairs[0].Providers, 3) - require.Equal(t, provider.ProviderKraken, cfg.CurrencyPairs[0].Providers[0]) - require.Equal(t, provider.ProviderBinance, cfg.CurrencyPairs[0].Providers[1]) - require.Equal(t, cfg.Telemetry.Enabled, false) -} - -func TestParseConfig_InvalidProvider(t *testing.T) { - tmpFile, err := os.CreateTemp("", "price-feeder*.toml") - require.NoError(t, err) - defer os.Remove(tmpFile.Name()) - - content := []byte(` -listen_addr = "" - -[[currency_pairs]] -base = "ATOM" -quote = "USD" -providers = [ - "kraken", - "binance" -] - -[[currency_pairs]] -base = "JUNO" -quote = "USD" -providers = [ - "kraken", - "foobar" -] -`) - _, err = tmpFile.Write(content) - require.NoError(t, err) - - _, err = config.ParseConfig(tmpFile.Name()) - require.Error(t, err) -} - -func TestParseConfig_NonUSDQuote(t *testing.T) { - tmpFile, err := os.CreateTemp("", "price-feeder*.toml") - require.NoError(t, err) - defer os.Remove(tmpFile.Name()) - - content := []byte(` -listen_addr = "" - -[[currency_pairs]] -base = "ATOM" -quote = "USDT" -providers = [ - "kraken", - "binance" -] - -[[currency_pairs]] -base = "JUNO" -quote = "USDT" -providers = [ - "kraken", - "binance" -] -`) - _, err = tmpFile.Write(content) - require.NoError(t, err) - - _, err = config.ParseConfig(tmpFile.Name()) - require.Error(t, err) -} - -func TestParseConfig_Valid_Deviations(t *testing.T) { - tmpFile, err := os.CreateTemp("", "price-feeder*.toml") - require.NoError(t, err) - defer os.Remove(tmpFile.Name()) - - content := []byte(` -gas_adjustment = 1.5 - -[server] -listen_addr = "0.0.0.0:99999" -read_timeout = "20s" -verbose_cors = true -write_timeout = "20s" - -[[deviation_thresholds]] -base = "USDT" -threshold = "2" - -[[deviation_thresholds]] -base = "ATOM" -threshold = "1.5" - -[[currency_pairs]] -base = "ATOM" -quote = "USDT" -providers = [ - "kraken", - "binance", - "huobi" -] - -[[currency_pairs]] -base = "JUNO" -quote = "USDT" -providers = [ - "kraken", - "binance", - "huobi" -] - -[[currency_pairs]] -base = "USDT" -quote = "USD" -providers = [ - "kraken", - "binance", - "huobi" -] - -[account] -address = "juno15x87cdlt9ed0xhgtsdutdec3njg42q3a9vw7fn" -chain_id = "test-1" -validator = "junovaloper15x87cdlt9ed0xhgtsdutdec3njg42q3a63c3j2" - -[keyring] -backend = "test" -dir = "/Users/username/.JUNO" -pass = "keyringPassword" - -[rpc] -tmrpc_endpoint = "http://localhost:26657" -grpc_endpoint = "localhost:9090" -rpc_timeout = "100ms" - -[telemetry] -service-name = "price-feeder" -enabled = true -enable-hostname = true -enable-hostname-label = true -enable-service-label = true -prometheus-retention = 120 -global-labels = [["chain-id", "JUNO-local-testnet"]] -`) - _, err = tmpFile.Write(content) - require.NoError(t, err) - - cfg, err := config.ParseConfig(tmpFile.Name()) - require.NoError(t, err) - - require.Equal(t, "0.0.0.0:99999", cfg.Server.ListenAddr) - require.Equal(t, "20s", cfg.Server.WriteTimeout) - require.Equal(t, "20s", cfg.Server.ReadTimeout) - require.True(t, cfg.Server.VerboseCORS) - require.Len(t, cfg.CurrencyPairs, 3) - require.Equal(t, "ATOM", cfg.CurrencyPairs[0].Base) - require.Equal(t, "USDT", cfg.CurrencyPairs[0].Quote) - require.Len(t, cfg.CurrencyPairs[0].Providers, 3) - require.Equal(t, provider.ProviderKraken, cfg.CurrencyPairs[0].Providers[0]) - require.Equal(t, provider.ProviderBinance, cfg.CurrencyPairs[0].Providers[1]) - require.Equal(t, "2", cfg.Deviations[0].Threshold) - require.Equal(t, "USDT", cfg.Deviations[0].Base) - require.Equal(t, "1.5", cfg.Deviations[1].Threshold) - require.Equal(t, "ATOM", cfg.Deviations[1].Base) -} - -func TestParseConfig_Invalid_Deviations(t *testing.T) { - tmpFile, err := os.CreateTemp("", "price-feeder*.toml") - require.NoError(t, err) - defer os.Remove(tmpFile.Name()) - - content := []byte(` -gas_adjustment = 1.5 - -[server] -listen_addr = "0.0.0.0:99999" -read_timeout = "20s" -verbose_cors = true -write_timeout = "20s" - -[[deviation_thresholds]] -base = "USDT" -threshold = "4.0" - -[[deviation_thresholds]] -base = "ATOM" -threshold = "1.5" - -[[currency_pairs]] -base = "ATOM" -quote = "USDT" -providers = [ - "kraken", - "binance", - "huobi" -] - -[[currency_pairs]] -base = "JUNO" -quote = "USDT" -providers = [ - "kraken", - "binance", - "huobi" -] - -[[currency_pairs]] -base = "USDT" -quote = "USD" -providers = [ - "kraken", - "binance", - "huobi" -] - -[account] -address = "juno15x87cdlt9ed0xhgtsdutdec3njg42q3a9vw7fn" -chain_id = "test-1" -validator = "junovaloper15x87cdlt9ed0xhgtsdutdec3njg42q3a63c3j2" - -[keyring] -backend = "test" -dir = "/Users/username/.JUNO" -pass = "keyringPassword" - -[rpc] -tmrpc_endpoint = "http://localhost:26657" -grpc_endpoint = "localhost:9090" -rpc_timeout = "100ms" - -[telemetry] -service-name = "price-feeder" -enabled = true -enable-hostname = true -enable-hostname_label = true -enable-service_label = true -prometheus-retention = 120 -global-labels = [["chain-id", "JUNO-local-testnet"]] -`) - _, err = tmpFile.Write(content) - require.NoError(t, err) - - _, err = config.ParseConfig(tmpFile.Name()) - require.Error(t, err) -} - -func TestParseConfig_Env_Vars(t *testing.T) { - tmpFile, err := os.CreateTemp("", "price-feeder*.toml") - require.NoError(t, err) - defer os.Remove(tmpFile.Name()) - - content := []byte(` -gas_adjustment = 1.5 - -[server] -listen_addr = "0.0.0.0:99999" -read_timeout = "20s" -verbose_cors = true -write_timeout = "20s" - -[[currency_pairs]] -base = "ATOM" -quote = "USDT" -providers = [ - "kraken", - "binance", - "huobi" -] - -[[currency_pairs]] -base = "JUNO" -quote = "USDT" -providers = [ - "kraken", - "binance", - "huobi" -] - -[[currency_pairs]] -base = "USDT" -quote = "USD" -providers = [ - "kraken", - "binance", - "huobi" -] - -[account] -address = "juno15x87cdlt9ed0xhgtsdutdec3njg42q3a9vw7fn" -chain_id = "test-1" -validator = "junovaloper15x87cdlt9ed0xhgtsdutdec3njg42q3a63c3j2" - -[keyring] -backend = "test" -dir = "/Users/username/.JUNO" -pass = "keyringPassword" - -[rpc] -tmrpc_endpoint = "http://localhost:26657" -grpc_endpoint = "localhost:9090" -rpc_timeout = "100ms" - -[telemetry] -service-name = "price-feeder" -enabled = true -enable-hostname = true -enable-hostname_label = true -enable-service_label = true -prometheus-retention = 120 -global-labels = [["chain-id", "JUNO-local-testnet"]] -`) - _, err = tmpFile.Write(content) - require.NoError(t, err) - - // Set env variables to overwrite config files - os.Setenv("SERVER.LISTEN_ADDR", "0.0.0.0:888888") - os.Setenv("SERVER.WRITE_TIMEOUT", "10s") - os.Setenv("SERVER.READ_TIMEOUT", "10s") - os.Setenv("SERVER.VERBOSE_CORS", "false") - - cfg, err := config.ParseConfig(tmpFile.Name()) - require.NoError(t, err) - - require.Equal(t, "0.0.0.0:888888", cfg.Server.ListenAddr) - require.Equal(t, "10s", cfg.Server.WriteTimeout) - require.Equal(t, "10s", cfg.Server.ReadTimeout) - require.False(t, cfg.Server.VerboseCORS) - require.Len(t, cfg.CurrencyPairs, 3) - require.Equal(t, "ATOM", cfg.CurrencyPairs[0].Base) - require.Equal(t, "USDT", cfg.CurrencyPairs[0].Quote) - require.Len(t, cfg.CurrencyPairs[0].Providers, 3) - require.Equal(t, provider.ProviderKraken, cfg.CurrencyPairs[0].Providers[0]) - require.Equal(t, provider.ProviderBinance, cfg.CurrencyPairs[0].Providers[1]) -} - -func TestCheckProviderMins_Valid(t *testing.T) { - tmpFile, err := os.CreateTemp("", "price-feeder*.toml") - require.NoError(t, err) - defer os.Remove(tmpFile.Name()) - - content := []byte(` -gas_adjustment = 1.5 - -[server] -listen_addr = "0.0.0.0:99999" -read_timeout = "20s" -verbose_cors = true -write_timeout = "20s" - -[[currency_pairs]] -base = "ATOM" -quote = "USDT" -providers = [ - "kraken", - "binance", - "huobi" -] - -[[currency_pairs]] -base = "JUNO" -quote = "USDT" -providers = [ - "kraken", - "binance", - "huobi" -] - -[[currency_pairs]] -base = "USDT" -quote = "USD" -providers = [ - "kraken", - "binance", - "huobi" -] - -[account] -address = "juno15x87cdlt9ed0xhgtsdutdec3njg42q3a9vw7fn" -chain_id = "test-1" -validator = "junovaloper15x87cdlt9ed0xhgtsdutdec3njg42q3a63c3j2" - -[keyring] -backend = "test" -dir = "/Users/username/.JUNO" -pass = "keyringPassword" - -[rpc] -tmrpc_endpoint = "http://localhost:26657" -grpc_endpoint = "localhost:9090" -rpc_timeout = "100ms" - -[telemetry] -enabled = false -`) - _, err = tmpFile.Write(content) - require.NoError(t, err) - - cfg, err := config.ParseConfig(tmpFile.Name()) - require.NoError(t, err) - - logger := zerolog.New(zerolog.ConsoleWriter{Out: os.Stderr}).Level(zerolog.InfoLevel).With().Timestamp().Logger() - err = config.CheckProviderMins(context.TODO(), logger, cfg) - require.NoError(t, err) -} - -func TestCheckProviderMins_Invalid(t *testing.T) { - tmpFile, err := os.CreateTemp("", "price-feeder*.toml") - require.NoError(t, err) - defer os.Remove(tmpFile.Name()) - - content := []byte(` -gas_adjustment = 1.5 - -[server] -listen_addr = "0.0.0.0:99999" -read_timeout = "20s" -verbose_cors = true -write_timeout = "20s" - -[[currency_pairs]] -base = "ATOM" -quote = "USDT" -providers = [ - "kraken", -] - -[[currency_pairs]] -base = "JUNO" -quote = "USDT" -providers = [ - "kraken", - "binance", - "huobi" -] - -[[currency_pairs]] -base = "USDT" -quote = "USD" -providers = [ - "kraken", - "binance", - "huobi" -] - -[account] -address = "juno15x87cdlt9ed0xhgtsdutdec3njg42q3a9vw7fn" -chain_id = "test-1" -validator = "junovaloper15x87cdlt9ed0xhgtsdutdec3njg42q3a63c3j2" - -[keyring] -backend = "test" -dir = "/Users/username/.JUNO" -pass = "keyringPassword" - -[rpc] -tmrpc_endpoint = "http://localhost:26657" -grpc_endpoint = "localhost:9090" -rpc_timeout = "100ms" - -[telemetry] -enabled = false -`) - _, err = tmpFile.Write(content) - require.NoError(t, err) - - cfg, err := config.ParseConfig(tmpFile.Name()) - require.NoError(t, err) - - logger := zerolog.New(zerolog.ConsoleWriter{Out: os.Stderr}).Level(zerolog.InfoLevel).With().Timestamp().Logger() - err = config.CheckProviderMins(context.TODO(), logger, cfg) - require.EqualError(t, err, "must have at least 2 providers for ATOM") -} diff --git a/price-feeder/config/currency_provider_tracker.go b/price-feeder/config/currency_provider_tracker.go deleted file mode 100644 index 59ee2b83f..000000000 --- a/price-feeder/config/currency_provider_tracker.go +++ /dev/null @@ -1,166 +0,0 @@ -package config - -import ( - "context" - "encoding/json" - "fmt" - "net/http" - "strings" - "time" - - "github.com/rs/zerolog" -) - -const ( - coinGeckoRestURL = "https://api.coingecko.com/api/v3/coins" - coinGeckoListEndpoint = "list" - coinGeckoTickersEndpoint = "tickers" - trackingPeriod = time.Hour * 24 -) - -type ( - // CurrencyProviderTracker queries the CoinGecko API for all the exchanges that - // support the currency pairs set in the price feeder config. It will poll the API - // every 24 hours to log any new exchanges that were added for a given currency. - // - // REF: https://www.coingecko.com/en/api/documentation - CurrencyProviderTracker struct { - logger zerolog.Logger - pairs []CurrencyPair - coinIDSymbolMap map[string]string // ex: map["ATOM"] = "cosmos" - CurrencyProviders map[string][]string // map of price feeder currencies and what exchanges support them - CurrencyProviderMin map[string]int // map of price feeder currencies and min required providers for them - } - - // List of assets on CoinGecko and their corresponding id and symbol. - coinList struct { - ID string `json:"id"` // ex: "cosmos" - Symbol string `json:"symbol"` // ex: "ATOM" - } - - // CoinGecko ticker shows market data for a given currency pair including what - // exchanges they're on. - coinTickerResponse struct { - Tickers []coinTicker `json:"tickers"` - } - coinTicker struct { - Base string `json:"base"` // CurrencyPair.Base - Target string `json:"target"` // CurrencyPair.Quote - Market coinMarket `json:"market"` - } - coinMarket struct { - Name string `json:"name"` // ex: Binance - } -) - -func NewCurrencyProviderTracker( - ctx context.Context, - logger zerolog.Logger, - pairs ...CurrencyPair, -) (*CurrencyProviderTracker, error) { - currencyProviderTracker := &CurrencyProviderTracker{ - logger: logger, - pairs: pairs, - coinIDSymbolMap: map[string]string{}, - CurrencyProviders: map[string][]string{}, - CurrencyProviderMin: map[string]int{}, - } - - if err := currencyProviderTracker.setCoinIDSymbolMap(); err != nil { - return nil, err - } - - if err := currencyProviderTracker.setCurrencyProviders(); err != nil { - return nil, err - } - - currencyProviderTracker.setCurrencyProviderMin() - - go currencyProviderTracker.trackCurrencyProviders(ctx) - - return currencyProviderTracker, nil -} - -func (t *CurrencyProviderTracker) logCurrencyProviders() { - for currency, providers := range t.CurrencyProviders { - t.logger.Info().Msg(fmt.Sprintf("providers supporting %s: %v", currency, providers)) - } -} - -// setCoinIDSymbolMap gets list of assets on coingecko to cross reference coin symbol to id. -func (t *CurrencyProviderTracker) setCoinIDSymbolMap() error { - resp, err := http.Get(fmt.Sprintf("%s/%s", coinGeckoRestURL, coinGeckoListEndpoint)) - if err != nil { - return err - } - defer resp.Body.Close() - - var listResponse []coinList - if err := json.NewDecoder(resp.Body).Decode(&listResponse); err != nil { - return err - } - - for _, coin := range listResponse { - t.coinIDSymbolMap[coin.Symbol] = coin.ID - } - - return nil -} - -// setCurrencyProviders queries CoinGecko's tickers endpoint to get all the exchanges that -// support each price feeder currency pair and store it in the CurrencyProviders map. -func (t *CurrencyProviderTracker) setCurrencyProviders() error { - for _, pair := range t.pairs { - pairBaseID := t.coinIDSymbolMap[strings.ToLower(pair.Base)] - resp, err := http.Get(fmt.Sprintf("%s/%s/%s", coinGeckoRestURL, pairBaseID, coinGeckoTickersEndpoint)) - if err != nil { - return err - } - defer resp.Body.Close() - - var tickerResponse coinTickerResponse - if err = json.NewDecoder(resp.Body).Decode(&tickerResponse); err != nil { - return err - } - - for _, ticker := range tickerResponse.Tickers { - if ticker.Target == pair.Quote { - t.CurrencyProviders[pair.Base] = append(t.CurrencyProviders[pair.Base], ticker.Market.Name) - } - } - } - - return nil -} - -// setCurrencyProviderMin will set the minimum amount of providers for each currency -// to the amount of exchanges that support them if it's less than 2. Otherwise it is -// set to 2 providers. -func (t *CurrencyProviderTracker) setCurrencyProviderMin() { - for base, exchanges := range t.CurrencyProviders { - if len(exchanges) < 2 { - t.CurrencyProviderMin[base] = len(exchanges) - } else { - t.CurrencyProviderMin[base] = 2 - } - } -} - -// trackCurrencyProviders resets CurrencyProviders map and logs out supported -// exchanges for each currency every 24 hours. -func (t *CurrencyProviderTracker) trackCurrencyProviders(ctx context.Context) { - t.logCurrencyProviders() - - for { - select { - case <-ctx.Done(): - return - case <-time.After(trackingPeriod): - if err := t.setCurrencyProviders(); err != nil { - t.logger.Error().Err(err).Msg("failed to set available providers for currencies") - } - - t.logCurrencyProviders() - } - } -} diff --git a/price-feeder/go.mod b/price-feeder/go.mod deleted file mode 100644 index ba8947a28..000000000 --- a/price-feeder/go.mod +++ /dev/null @@ -1,290 +0,0 @@ -module github.com/CosmosContracts/juno/price-feeder - -go 1.20 - -require ( - github.com/CosmosContracts/juno/v13 v13.0.0 - github.com/armon/go-metrics v0.4.1 - github.com/cosmos/cosmos-sdk v0.45.12 - github.com/go-playground/validator/v10 v10.11.1 - github.com/golangci/golangci-lint v1.50.1 - github.com/gorilla/mux v1.8.0 - github.com/gorilla/websocket v1.5.0 - github.com/justinas/alice v1.2.0 - github.com/mitchellh/mapstructure v1.5.0 - github.com/rs/cors v1.8.2 - github.com/rs/zerolog v1.28.0 - github.com/spf13/cobra v1.6.1 - github.com/spf13/viper v1.15.0 - github.com/stretchr/testify v1.8.1 - github.com/tendermint/tendermint v0.34.26 - golang.org/x/sync v0.1.0 - golang.org/x/term v0.4.0 - google.golang.org/grpc v1.52.3 - gopkg.in/yaml.v3 v3.0.1 -) - -require ( - 4d63.com/gochecknoglobals v0.1.0 // indirect - filippo.io/edwards25519 v1.0.0-rc.1 // indirect - github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect - github.com/99designs/keyring v1.2.1 // indirect - github.com/Abirdcfly/dupword v0.0.7 // indirect - github.com/Antonboom/errname v0.1.7 // indirect - github.com/Antonboom/nilnil v0.1.1 // indirect - github.com/BurntSushi/toml v1.2.1 // indirect - github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d // indirect - github.com/CosmWasm/token-factory v0.0.0-20221024170206-1345f322c887 // indirect - github.com/CosmWasm/wasmd v0.30.0 // indirect - github.com/CosmWasm/wasmvm v1.1.1 // indirect - github.com/Djarvur/go-err113 v0.1.0 // indirect - github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 // indirect - github.com/Masterminds/semver v1.5.0 // indirect - github.com/OpenPeeDeeP/depguard v1.1.1 // indirect - github.com/Workiva/go-datastructures v1.0.53 // indirect - github.com/alexkohler/prealloc v1.0.0 // indirect - github.com/alingse/asasalint v0.0.11 // indirect - github.com/ashanbrown/forbidigo v1.3.0 // indirect - github.com/ashanbrown/makezero v1.1.1 // indirect - github.com/benbjohnson/clock v1.3.0 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect - github.com/bkielbasa/cyclop v1.2.0 // indirect - github.com/blizzy78/varnamelen v0.8.0 // indirect - github.com/bombsimon/wsl/v3 v3.3.0 // indirect - github.com/breml/bidichk v0.2.3 // indirect - github.com/breml/errchkjson v0.3.0 // indirect - github.com/btcsuite/btcd v0.22.2 // indirect - github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/butuzov/ireturn v0.1.1 // indirect - github.com/cenkalti/backoff/v4 v4.1.3 // indirect - github.com/cespare/xxhash v1.1.0 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/charithe/durationcheck v0.0.9 // indirect - github.com/chavacava/garif v0.0.0-20220630083739-93517212f375 // indirect - github.com/coinbase/rosetta-sdk-go v0.7.9 // indirect - github.com/confio/ics23/go v0.9.0 // indirect - github.com/cosmos/btcutil v1.0.5 // indirect - github.com/cosmos/cosmos-proto v1.0.0-beta.1 // indirect - github.com/cosmos/go-bip39 v1.0.0 // indirect - github.com/cosmos/gogoproto v1.4.4 // indirect - github.com/cosmos/gorocksdb v1.2.0 // indirect - github.com/cosmos/iavl v0.19.4 // indirect - github.com/cosmos/ibc-go/v4 v4.3.0 // indirect - github.com/cosmos/interchain-accounts v0.2.5 // indirect - github.com/cosmos/ledger-cosmos-go v0.12.2 // indirect - github.com/creachadair/taskgroup v0.3.2 // indirect - github.com/curioswitch/go-reassign v0.2.0 // indirect - github.com/daixiang0/gci v0.8.1 // indirect - github.com/danieljoos/wincred v1.1.2 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect - github.com/denis-tingaikin/go-header v0.4.3 // indirect - github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect - github.com/dgraph-io/badger/v3 v3.2103.2 // indirect - github.com/dgraph-io/ristretto v0.1.0 // indirect - github.com/docker/distribution v2.8.1+incompatible // indirect - github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac // indirect - github.com/dvsekhvalnov/jose2go v1.5.0 // indirect - github.com/esimonov/ifshort v1.0.4 // indirect - github.com/ettle/strcase v0.1.1 // indirect - github.com/fatih/color v1.13.0 // indirect - github.com/fatih/structtag v1.2.0 // indirect - github.com/felixge/httpsnoop v1.0.2 // indirect - github.com/firefart/nonamedreturns v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/fzipp/gocyclo v0.6.0 // indirect - github.com/gin-gonic/gin v1.7.0 // indirect - github.com/go-critic/go-critic v0.6.5 // indirect - github.com/go-kit/kit v0.12.0 // indirect - github.com/go-kit/log v0.2.1 // indirect - github.com/go-logfmt/logfmt v0.5.1 // indirect - github.com/go-playground/locales v0.14.0 // indirect - github.com/go-playground/universal-translator v0.18.0 // indirect - github.com/go-toolsmith/astcast v1.0.0 // indirect - github.com/go-toolsmith/astcopy v1.0.2 // indirect - github.com/go-toolsmith/astequal v1.0.3 // indirect - github.com/go-toolsmith/astfmt v1.0.0 // indirect - github.com/go-toolsmith/astp v1.0.0 // indirect - github.com/go-toolsmith/strparse v1.0.0 // indirect - github.com/go-toolsmith/typep v1.0.2 // indirect - github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b // indirect - github.com/gobwas/glob v0.2.3 // indirect - github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect - github.com/gofrs/flock v0.8.1 // indirect - github.com/gogo/gateway v1.1.0 // indirect - github.com/gogo/protobuf v1.3.3 // indirect - github.com/golang/glog v1.0.0 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/golang/snappy v0.0.4 // indirect - github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 // indirect - github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a // indirect - github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe // indirect - github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2 // indirect - github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 // indirect - github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca // indirect - github.com/golangci/misspell v0.3.5 // indirect - github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 // indirect - github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 // indirect - github.com/google/btree v1.1.2 // indirect - github.com/google/flatbuffers v1.12.1 // indirect - github.com/google/go-cmp v0.5.9 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/orderedcode v0.0.1 // indirect - github.com/gordonklaus/ineffassign v0.0.0-20210914165742-4cc7213b9bc8 // indirect - github.com/gorilla/handlers v1.5.1 // indirect - github.com/gostaticanalysis/analysisutil v0.7.1 // indirect - github.com/gostaticanalysis/comment v1.4.2 // indirect - github.com/gostaticanalysis/forcetypeassert v0.1.0 // indirect - github.com/gostaticanalysis/nilerr v0.1.1 // indirect - github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect - github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect - github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect - github.com/gtank/merlin v0.1.1 // indirect - github.com/gtank/ristretto255 v0.1.2 // indirect - github.com/hashicorp/errwrap v1.1.0 // indirect - github.com/hashicorp/go-immutable-radix v1.3.1 // indirect - github.com/hashicorp/go-multierror v1.1.1 // 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/hcl v1.0.0 // indirect - github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3 // indirect - github.com/hexops/gotextdiff v1.0.3 // indirect - github.com/iancoleman/orderedmap v0.2.0 // indirect - github.com/improbable-eng/grpc-web v0.15.0 // indirect - github.com/inconshreveable/mousetrap v1.0.1 // indirect - github.com/jgautheron/goconst v1.5.1 // indirect - github.com/jingyugao/rowserrcheck v1.1.1 // indirect - github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af // indirect - github.com/jmhodges/levigo v1.0.0 // indirect - github.com/julz/importas v0.1.0 // indirect - github.com/kisielk/errcheck v1.6.2 // indirect - github.com/kisielk/gotool v1.0.0 // indirect - github.com/kkHAIKE/contextcheck v1.1.3 // indirect - github.com/klauspost/compress v1.15.11 // indirect - github.com/kulti/thelper v0.6.3 // indirect - github.com/kunwardeep/paralleltest v1.0.6 // indirect - github.com/kyoh86/exportloopref v0.1.8 // indirect - github.com/ldez/gomoddirectives v0.2.3 // indirect - github.com/ldez/tagliatelle v0.3.1 // indirect - github.com/leodido/go-urn v1.2.1 // indirect - github.com/leonklingele/grouper v1.1.0 // indirect - github.com/lib/pq v1.10.6 // indirect - github.com/libp2p/go-buffer-pool v0.1.0 // indirect - github.com/lufeee/execinquery v1.2.1 // indirect - github.com/magiconair/properties v1.8.7 // indirect - github.com/maratori/testableexamples v1.0.0 // indirect - github.com/maratori/testpackage v1.1.0 // indirect - github.com/matoous/godox v0.0.0-20210227103229-6504466cf951 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.16 // indirect - github.com/mattn/go-runewidth v0.0.10 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect - github.com/mbilski/exhaustivestruct v1.2.0 // indirect - github.com/mgechev/revive v1.2.4 // indirect - github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect - github.com/minio/highwayhash v1.0.2 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/moricho/tparallel v0.2.1 // indirect - github.com/mtibben/percent v0.2.1 // indirect - github.com/nakabonne/nestif v0.3.1 // indirect - github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 // indirect - github.com/nishanths/exhaustive v0.8.3 // indirect - github.com/nishanths/predeclared v0.2.2 // indirect - github.com/nxadm/tail v1.4.8 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/osmosis-labs/osmosis/osmoutils v0.0.3-rc0 // indirect - github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201151635-ef43e092d196 // indirect - github.com/pelletier/go-toml/v2 v2.0.6 // indirect - github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 // indirect - github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/polyfloyd/go-errorlint v1.0.5 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.37.0 // indirect - github.com/prometheus/procfs v0.8.0 // indirect - github.com/quasilyte/go-ruleguard v0.3.18 // indirect - github.com/quasilyte/gogrep v0.0.0-20220828223005-86e4605de09f // indirect - github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 // indirect - github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect - github.com/rakyll/statik v0.1.7 // indirect - github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect - github.com/regen-network/cosmos-proto v0.3.1 // indirect - github.com/rivo/uniseg v0.2.0 // indirect - github.com/rs/xid v1.4.0 // indirect - github.com/ryancurrah/gomodguard v1.2.4 // indirect - github.com/ryanrolds/sqlclosecheck v0.3.0 // indirect - github.com/sanposhiho/wastedassign/v2 v2.0.6 // indirect - github.com/sasha-s/go-deadlock v0.3.1 // indirect - github.com/sashamelentyev/interfacebloat v1.1.0 // indirect - github.com/sashamelentyev/usestdlibvars v1.20.0 // indirect - github.com/securego/gosec/v2 v2.13.1 // indirect - github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c // indirect - github.com/sirupsen/logrus v1.9.0 // indirect - github.com/sivchari/containedctx v1.0.2 // indirect - github.com/sivchari/nosnakecase v1.7.0 // indirect - github.com/sivchari/tenv v1.7.0 // indirect - github.com/sonatard/noctx v0.0.1 // indirect - github.com/sourcegraph/go-diff v0.6.1 // indirect - github.com/spf13/afero v1.9.3 // indirect - github.com/spf13/cast v1.5.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect - github.com/stbenjam/no-sprintf-host-port v0.1.1 // indirect - github.com/strangelove-ventures/packet-forward-middleware/v4 v4.0.4 // indirect - github.com/stretchr/objx v0.5.0 // indirect - github.com/subosito/gotenv v1.4.2 // indirect - github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect - github.com/tdakkota/asciicheck v0.1.1 // indirect - github.com/tendermint/go-amino v0.16.0 // indirect - github.com/tendermint/tm-db v0.6.8-0.20220506192307-f628bb5dc95b // indirect - github.com/tetafro/godot v1.4.11 // indirect - github.com/tidwall/btree v1.5.0 // indirect - github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144 // indirect - github.com/timonwong/loggercheck v0.9.3 // indirect - github.com/tomarrell/wrapcheck/v2 v2.7.0 // indirect - github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect - github.com/ultraware/funlen v0.0.3 // indirect - github.com/ultraware/whitespace v0.0.5 // indirect - github.com/uudashr/gocognit v1.0.6 // indirect - github.com/yagipy/maintidx v1.0.0 // indirect - github.com/yeya24/promlinter v0.2.0 // indirect - github.com/zondax/hid v0.9.1 // indirect - github.com/zondax/ledger-go v0.14.1 // indirect - gitlab.com/bosi/decorder v0.2.3 // indirect - go.etcd.io/bbolt v1.3.6 // indirect - go.opencensus.io v0.24.0 // indirect - go.uber.org/atomic v1.10.0 // indirect - go.uber.org/goleak v1.1.12 // indirect - go.uber.org/multierr v1.8.0 // indirect - go.uber.org/zap v1.23.0 // indirect - golang.org/x/crypto v0.5.0 // indirect - golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect - golang.org/x/exp/typeparams v0.0.0-20220827204233-334a2380cb91 // indirect - golang.org/x/mod v0.7.0 // indirect - golang.org/x/net v0.5.0 // indirect - golang.org/x/sys v0.4.0 // indirect - golang.org/x/text v0.6.0 // indirect - golang.org/x/tools v0.4.0 // indirect - google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef // indirect - google.golang.org/protobuf v1.28.2-0.20220831092852-f930b1dc76e8 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - honnef.co/go/tools v0.3.3 // indirect - mvdan.cc/gofumpt v0.4.0 // indirect - mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed // indirect - mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b // indirect - mvdan.cc/unparam v0.0.0-20220706161116-678bad134442 // indirect - nhooyr.io/websocket v1.8.7 // indirect -) - -replace ( - github.com/CosmosContracts/juno/v13 => ../ - github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.2-alpha.regen.4 - github.com/tendermint/tendermint => github.com/informalsystems/tendermint v0.34.25 -) diff --git a/price-feeder/go.sum b/price-feeder/go.sum deleted file mode 100644 index ef7be9413..000000000 --- a/price-feeder/go.sum +++ /dev/null @@ -1,1800 +0,0 @@ -4d63.com/gochecknoglobals v0.1.0 h1:zeZSRqj5yCg28tCkIV/z/lWbwvNm5qnKVS15PI8nhD0= -4d63.com/gochecknoglobals v0.1.0/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo= -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -filippo.io/edwards25519 v1.0.0-rc.1 h1:m0VOOB23frXZvAOK44usCgLWvtsxIoMCTBGJZlpmGfU= -filippo.io/edwards25519 v1.0.0-rc.1/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= -git.sr.ht/~sircmpwn/getopt v0.0.0-20191230200459-23622cc906b3/go.mod h1:wMEGFFFNuPos7vHmWXfszqImLppbc0wEhh6JBfJIUgw= -git.sr.ht/~sircmpwn/go-bare v0.0.0-20210406120253-ab86bc2846d9/go.mod h1:BVJwbDfVjCjoFiKrhkei6NdGcZYpkDkdyCdg1ukytRA= -github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= -github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= -github.com/99designs/keyring v1.2.1 h1:tYLp1ULvO7i3fI5vE21ReQuj99QFSs7lGm0xWyJo87o= -github.com/99designs/keyring v1.2.1/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= -github.com/Abirdcfly/dupword v0.0.7 h1:z14n0yytA3wNO2gpCD/jVtp/acEXPGmYu0esewpBt6Q= -github.com/Abirdcfly/dupword v0.0.7/go.mod h1:K/4M1kj+Zh39d2aotRwypvasonOyAMH1c/IZJzE0dmk= -github.com/Antonboom/errname v0.1.7 h1:mBBDKvEYwPl4WFFNwec1CZO096G6vzK9vvDQzAwkako= -github.com/Antonboom/errname v0.1.7/go.mod h1:g0ONh16msHIPgJSGsecu1G/dcF2hlYR/0SddnIAGavU= -github.com/Antonboom/nilnil v0.1.1 h1:PHhrh5ANKFWRBh7TdYmyyq2gyT2lotnvFvvFbylF81Q= -github.com/Antonboom/nilnil v0.1.1/go.mod h1:L1jBqoWM7AOeTD+tSquifKSesRHs4ZdaxvZR+xdJEaI= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= -github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg= -github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= -github.com/CosmWasm/token-factory v0.0.0-20221024170206-1345f322c887 h1:TfdPjMOtnZSrsKsHCyxorF/GY2Lnjpeq+llOjs7C/0g= -github.com/CosmWasm/token-factory v0.0.0-20221024170206-1345f322c887/go.mod h1:EK4n8nCrMCM9bHCYgA9fmxzzDANu5RQ3E7dt6XBCDQo= -github.com/CosmWasm/wasmd v0.30.0 h1:oUVz3TgO/+24JZQdoTOlOv+IK7N9hEa/s3M4eR9i4FQ= -github.com/CosmWasm/wasmd v0.30.0/go.mod h1:umLGeYyowAMMEdOYfDOf8jsDrQ75Qkm1+ogBXT/w01c= -github.com/CosmWasm/wasmvm v1.1.1 h1:0xtdrmmsP9fibe+x42WcMkp5aQ738BICgcH3FNVLzm4= -github.com/CosmWasm/wasmvm v1.1.1/go.mod h1:ei0xpvomwSdONsxDuONzV7bL1jSET1M8brEx0FCXc+A= -github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/DataDog/zstd v1.5.0/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/Djarvur/go-err113 v0.1.0 h1:uCRZZOdMQ0TZPHYTdYpoC0bLYJKPEHPUJ8MeAa51lNU= -github.com/Djarvur/go-err113 v0.1.0/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= -github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 h1:+r1rSv4gvYn0wmRjC8X7IAzX8QezqtFV9m0MUHFJgts= -github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= -github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= -github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= -github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/OpenPeeDeeP/depguard v1.1.1 h1:TSUznLjvp/4IUP+OQ0t/4jF4QUyxIcVX8YnghZdunyA= -github.com/OpenPeeDeeP/depguard v1.1.1/go.mod h1:JtAMzWkmFEzDPyAd+W0NHl1lvpQKTvT9jnRVsohBKpc= -github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= -github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= -github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/Workiva/go-datastructures v1.0.53 h1:J6Y/52yX10Xc5JjXmGtWoSSxs3mZnGSaq37xZZh7Yig= -github.com/Workiva/go-datastructures v1.0.53/go.mod h1:1yZL+zfsztete+ePzZz/Zb1/t5BnDuE2Ya2MMGhzP6A= -github.com/Zilliqa/gozilliqa-sdk v1.2.1-0.20201201074141-dd0ecada1be6/go.mod h1:eSYp2T6f0apnuW8TzhV3f6Aff2SE8Dwio++U4ha4yEM= -github.com/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= -github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pOcUuw= -github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= -github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQRnw= -github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I= -github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= -github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= -github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= -github.com/ashanbrown/forbidigo v1.3.0 h1:VkYIwb/xxdireGAdJNZoo24O4lmnEWkactplBlWTShc= -github.com/ashanbrown/forbidigo v1.3.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= -github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5FcB28s= -github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI= -github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= -github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= -github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= -github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= -github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= -github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= -github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= -github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= -github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= -github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= -github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bkielbasa/cyclop v1.2.0 h1:7Jmnh0yL2DjKfw28p86YTd/B4lRGcNuu12sKE35sM7A= -github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= -github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M= -github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= -github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= -github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= -github.com/bombsimon/wsl/v3 v3.3.0 h1:Mka/+kRLoQJq7g2rggtgQsjuI/K5Efd87WX96EWFxjM= -github.com/bombsimon/wsl/v3 v3.3.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= -github.com/breml/bidichk v0.2.3 h1:qe6ggxpTfA8E75hdjWPZ581sY3a2lnl0IRxLQFelECI= -github.com/breml/bidichk v0.2.3/go.mod h1:8u2C6DnAy0g2cEq+k/A2+tr9O1s+vHGxWn0LTc70T2A= -github.com/breml/errchkjson v0.3.0 h1:YdDqhfqMT+I1vIxPSas44P+9Z9HzJwCeAzjB8PxP1xw= -github.com/breml/errchkjson v0.3.0/go.mod h1:9Cogkyv9gcT8HREpzi3TiqBxCqDzo8awa92zSDFcofU= -github.com/btcsuite/btcd v0.0.0-20190315201642-aa6e0f35703c/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= -github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btcd v0.21.0-beta.0.20201114000516-e9c7a5ac6401/go.mod h1:Sv4JPQ3/M+teHz9Bo5jBpkNcP0x6r7rdihlNL/7tTAs= -github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y= -github.com/btcsuite/btcd v0.22.2 h1:vBZ+lGGd1XubpOWO67ITJpAEsICWhA0YzqkcpkgNBfo= -github.com/btcsuite/btcd v0.22.2/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y= -github.com/btcsuite/btcd/btcec/v2 v2.1.2/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= -github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= -github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= -github.com/btcsuite/btcd/btcutil v1.1.2 h1:XLMbX8JQEiwMcYft2EGi8zPUkoa0abKIU6/BJSRsjzQ= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts= -github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= -github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= -github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/butuzov/ireturn v0.1.1 h1:QvrO2QF2+/Cx1WA/vETCIYBKtRjc30vesdoPUNo1EbY= -github.com/butuzov/ireturn v0.1.1/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= -github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= -github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= -github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= -github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= -github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= -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/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/charithe/durationcheck v0.0.9 h1:mPP4ucLrf/rKZiIG/a9IPXHGlh8p4CzgpyTy6EEutYk= -github.com/charithe/durationcheck v0.0.9/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= -github.com/chavacava/garif v0.0.0-20220630083739-93517212f375 h1:E7LT642ysztPWE0dfz43cWOvMiF42DyTRC+eZIaO4yI= -github.com/chavacava/garif v0.0.0-20220630083739-93517212f375/go.mod h1:4m1Rv7xfuwWPNKXlThldNuJvutYM6J95wNuuVmn55To= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/coinbase/kryptology v1.8.0/go.mod h1:RYXOAPdzOGUe3qlSFkMGn58i3xUA8hmxYHksuq+8ciI= -github.com/coinbase/rosetta-sdk-go v0.7.9 h1:lqllBjMnazTjIqYrOGv8h8jxjg9+hJazIGZr9ZvoCcA= -github.com/coinbase/rosetta-sdk-go v0.7.9/go.mod h1:0/knutI7XGVqXmmH4OQD8OckFrbQ8yMsUZTG7FXCR2M= -github.com/confio/ics23/go v0.9.0 h1:cWs+wdbS2KRPZezoaaj+qBleXgUk5WOQFMP3CQFGTr4= -github.com/confio/ics23/go v0.9.0/go.mod h1:4LPZ2NYqnYIVRklaozjNR1FScgDJ2s5Xrp+e/mYVRak= -github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= -github.com/consensys/bavard v0.1.8-0.20210915155054-088da2f7f54a/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q= -github.com/consensys/gnark-crypto v0.5.3/go.mod h1:hOdPlWQV1gDLp7faZVeg8Y0iEPFaOUnCc4XeCCk96p0= -github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -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/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= -github.com/cosmos/cosmos-proto v1.0.0-beta.1 h1:iDL5qh++NoXxG8hSy93FdYJut4XfgbShIocllGaXx/0= -github.com/cosmos/cosmos-proto v1.0.0-beta.1/go.mod h1:8k2GNZghi5sDRFw/scPL8gMSowT1vDA+5ouxL8GjaUE= -github.com/cosmos/cosmos-sdk v0.45.12 h1:Z0kOOjOfHP+loO42KZZo3Y+PAZsoYycyiSckVXzwOm4= -github.com/cosmos/cosmos-sdk v0.45.12/go.mod h1:ZAdIs09zttoA3aSwQCTK9gecOThUVNnzBSVj3DiS6UY= -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/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= -github.com/cosmos/gogoproto v1.4.4 h1:nVAsgLlAf5jeN0fV7hRlkZvf768zU+dy4pG+hxc2P34= -github.com/cosmos/gogoproto v1.4.4/go.mod h1:/yl6/nLwsZcZ2JY3OrqjRqvqCG9InUMcXRfRjQiF9DU= -github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4Y= -github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw= -github.com/cosmos/iavl v0.19.4 h1:t82sN+Y0WeqxDLJRSpNd8YFX5URIrT+p8n6oJbJ2Dok= -github.com/cosmos/iavl v0.19.4/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw= -github.com/cosmos/ibc-go/v3 v3.3.0 h1:r8gYUvQreMQrf4R5RgedK9gcbjLk4uE2q6fuZGjf4n0= -github.com/cosmos/ibc-go/v4 v4.3.0 h1:yOzVsyZzsv4XPBux8gq+D0LhZn45yGWKjvT+6Vyo5no= -github.com/cosmos/ibc-go/v4 v4.3.0/go.mod h1:CcLvIoi9NNtIbNsxs4KjBGjYhlwqtsmXy1AKARKiMzQ= -github.com/cosmos/interchain-accounts v0.2.5 h1:LM2+Z0HhP7k6vGmXL/CC5B6SgMxrYDfMYQciD3o9jt8= -github.com/cosmos/interchain-accounts v0.2.5/go.mod h1:eaQBOsAeGdFxXnv7c5sR5tQnRDJ7LkffsC3L/THpem4= -github.com/cosmos/ledger-cosmos-go v0.12.2 h1:/XYaBlE2BJxtvpkHiBm97gFGSGmYGKunKyF3nNqAXZA= -github.com/cosmos/ledger-cosmos-go v0.12.2/go.mod h1:ZcqYgnfNJ6lAXe4HPtWgarNEY+B74i+2/8MhZw4ziiI= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creachadair/taskgroup v0.3.2 h1:zlfutDS+5XG40AOxcHDSThxKzns8Tnr9jnr6VqkYlkM= -github.com/creachadair/taskgroup v0.3.2/go.mod h1:wieWwecHVzsidg2CsUnFinW1faVN4+kq+TDlRJQ0Wbk= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cristalhq/acmd v0.8.1/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= -github.com/curioswitch/go-reassign v0.2.0 h1:G9UZyOcpk/d7Gd6mqYgd8XYWFMw/znxwGDUstnC9DIo= -github.com/curioswitch/go-reassign v0.2.0/go.mod h1:x6OpXuWvgfQaMGks2BZybTngWjT84hqJfKoO8Tt/Roc= -github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= -github.com/daixiang0/gci v0.8.1 h1:T4xpSC+hmsi4CSyuYfIJdMZAr9o7xZmHpQVygMghGZ4= -github.com/daixiang0/gci v0.8.1/go.mod h1:EpVfrztufwVgQRXjnX4zuNinEpLj5OmMjtu/+MB0V0c= -github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= -github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= -github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= -github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= -github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= -github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= -github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= -github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= -github.com/denis-tingaikin/go-header v0.4.3 h1:tEaZKAlqql6SKCY++utLmkPLd6K8IBM20Ha7UVm+mtU= -github.com/denis-tingaikin/go-header v0.4.3/go.mod h1:0wOCWuN71D5qIgE2nz9KrKmuYBAC2Mra5RassOIQ2/c= -github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= -github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= -github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= -github.com/dgraph-io/badger/v3 v3.2103.2 h1:dpyM5eCJAtQCBcMCZcT4UBZchuTJgCywerHHgmxfxM8= -github.com/dgraph-io/badger/v3 v3.2103.2/go.mod h1:RHo4/GmYcKKh5Lxu63wLEMHJ70Pac2JqZRYGhlyAo2M= -github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.0.3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= -github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= -github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= -github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= -github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= -github.com/dop251/goja v0.0.0-20211011172007-d99e4b8cbf48/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= -github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac h1:opbrjaN/L8gg6Xh5D04Tem+8xVcz6ajZlGCs49mQgyg= -github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dvsekhvalnov/jose2go v1.5.0 h1:3j8ya4Z4kMCwT5nXIKFSV84YS+HdqSSO0VsTQxaLAeM= -github.com/dvsekhvalnov/jose2go v1.5.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -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.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/esimonov/ifshort v1.0.4 h1:6SID4yGWfRae/M7hkVDVVyppy8q/v9OuxNdmjLQStBA= -github.com/esimonov/ifshort v1.0.4/go.mod h1:Pe8zjlRrJ80+q2CxHLfEOfTwxCZ4O+MuhcHcfgNWTk0= -github.com/ethereum/go-ethereum v1.10.17/go.mod h1:Lt5WzjM07XlXc95YzrhosmR4J9Ahd6X2wyEV2SvGhk0= -github.com/ettle/strcase v0.1.1 h1:htFueZyVeE1XNnMEfbqp5r67qAN/4r6ya1ysq8Q+Zcw= -github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= -github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c h1:8ISkoahWXwZR41ois5lSJBSVw4D0OV19Ht/JSTzvSv0= -github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= -github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 h1:7HZCaLC5+BZpmbhCOZJ293Lz68O7PYrF2EzeiFMwCLk= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= -github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -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.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/firefart/nonamedreturns v1.0.4 h1:abzI1p7mAEPYuR4A+VLKn4eNDOycjYo2phmY9sfv40Y= -github.com/firefart/nonamedreturns v1.0.4/go.mod h1:TDhe/tjI1BXo48CmYbUduTV7BdIga8MAO/xbKdcVsGI= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= -github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= -github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= -github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= -github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -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/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/gin-gonic/gin v1.7.0 h1:jGB9xAJQ12AIGNB4HguylppmDK1Am9ppF7XnGXXJuoU= -github.com/gin-gonic/gin v1.7.0/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= -github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= -github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= -github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= -github.com/go-critic/go-critic v0.6.5 h1:fDaR/5GWURljXwF8Eh31T2GZNz9X4jeboS912mWF8Uo= -github.com/go-critic/go-critic v0.6.5/go.mod h1:ezfP/Lh7MA6dBNn4c6ab5ALv3sKnZVLx37tr00uuaOY= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -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.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.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -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-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= -github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= -github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= -github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= -github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g= -github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= -github.com/go-toolsmith/astcopy v1.0.2 h1:YnWf5Rnh1hUudj11kei53kI57quN/VH6Hp1n+erozn0= -github.com/go-toolsmith/astcopy v1.0.2/go.mod h1:4TcEdbElGc9twQEYpVo/aieIXfHhiuLh4aLAck6dO7Y= -github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= -github.com/go-toolsmith/astequal v1.0.2/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4= -github.com/go-toolsmith/astequal v1.0.3 h1:+LVdyRatFS+XO78SGV4I3TCEA0AC7fKEGma+fH+674o= -github.com/go-toolsmith/astequal v1.0.3/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4= -github.com/go-toolsmith/astfmt v1.0.0 h1:A0vDDXt+vsvLEdbMFJAUBI/uTbRw1ffOPnxsILnFL6k= -github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= -github.com/go-toolsmith/astp v1.0.0 h1:alXE75TXgcmupDsMK1fRAy0YUzLzqPVvBKoyWV+KPXg= -github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= -github.com/go-toolsmith/pkgload v1.0.2-0.20220101231613-e814995d17c5 h1:eD9POs68PHkwrx7hAB78z1cb6PfGq/jyWn3wJywsH1o= -github.com/go-toolsmith/pkgload v1.0.2-0.20220101231613-e814995d17c5/go.mod h1:3NAwwmD4uY/yggRxoEjk/S00MIV3A+H7rrE3i87eYxM= -github.com/go-toolsmith/strparse v1.0.0 h1:Vcw78DnpCAKlM20kSbAyO4mPfJn/lyYA4BJUDxe2Jb4= -github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= -github.com/go-toolsmith/typep v1.0.2 h1:8xdsa1+FSIH/RhEkgnD1j2CJOy5mNllW1Q9tRiYwvlk= -github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b h1:khEcpUM4yFcxg4/FHQWkvVRmgijNXRfzkIDHh23ggEo= -github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= -github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= -github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/gateway v1.1.0 h1:u0SuhL9+Il+UbjM9VIE3ntfRujKbvVpFvNB4HbjeVQ0= -github.com/gogo/gateway v1.1.0/go.mod h1:S7rR8FRQyG3QFESeSv4l2WnsyzlCLG0CzBbUUo/mbic= -github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -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-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= -github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= -github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe h1:6RGUuS7EGotKx6J5HIP8ZtyMdiDscjMLfRBSPuzVVeo= -github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe/go.mod h1:gjqyPShc/m8pEMpk0a3SeagVb0kaqvhscv+i9jI5ZhQ= -github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2 h1:amWTbTGqOZ71ruzrdA+Nx5WA3tV1N0goTspwmKCQvBY= -github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2/go.mod h1:9wOXstvyDRshQ9LggQuzBCGysxs3b6Uo/1MvYCR2NMs= -github.com/golangci/golangci-lint v1.50.1 h1:C829clMcZXEORakZlwpk7M4iDw2XiwxxKaG504SZ9zY= -github.com/golangci/golangci-lint v1.50.1/go.mod h1:AQjHBopYS//oB8xs0y0M/dtxdKHkdhl0RvmjUct0/4w= -github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= -github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 h1:MfyDlzVjl1hoaPzPD4Gpb/QgoRfSBR0jdhwGyAWwMSA= -github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= -github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA= -github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= -github.com/golangci/misspell v0.3.5 h1:pLzmVdl3VxTOncgzHcvLOKirdvcx/TydsClUQXTehjo= -github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= -github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 h1:DIPQnGy2Gv2FSA4B/hh8Q7xx3B7AIDk3DAMeHclH1vQ= -github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6/go.mod h1:0AKcRCkMoKvUvlf89F6O7H2LYdhr1zBh736mBItOdRs= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= -github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/flatbuffers v1.12.1 h1:MVlul7pQNoDzWRLTw5imwYsl+usrS1TXG2H4jg6ImGw= -github.com/google/flatbuffers v1.12.1/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= -github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= -github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/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.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gordonklaus/ineffassign v0.0.0-20210914165742-4cc7213b9bc8 h1:PVRE9d4AQKmbelZ7emNig1+NT27DUmKZn5qXxfio54U= -github.com/gordonklaus/ineffassign v0.0.0-20210914165742-4cc7213b9bc8/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= -github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gostaticanalysis/analysisutil v0.1.0/go.mod h1:dMhHRU9KTiDcuLGdy87/2gTR8WruwYZrKdRq9m1O6uw= -github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk= -github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= -github.com/gostaticanalysis/comment v1.3.0/go.mod h1:xMicKDx7XRXYdVwY9f9wQpDJVnqWxw9wCauCMKp+IBI= -github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= -github.com/gostaticanalysis/comment v1.4.2 h1:hlnx5+S2fY9Zo9ePo4AhgYsYHbM2+eAv8m/s1JiCd6Q= -github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= -github.com/gostaticanalysis/forcetypeassert v0.1.0 h1:6eUflI3DiGusXGK6X7cCcIgVCpZ2CiZ1Q7jl6ZxNV70= -github.com/gostaticanalysis/forcetypeassert v0.1.0/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= -github.com/gostaticanalysis/nilerr v0.1.1 h1:ThE+hJP0fEp4zWLkWHWcRyI2Od0p7DlgYG3Uqrmrcpk= -github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= -github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= -github.com/gostaticanalysis/testutil v0.4.0 h1:nhdCmubdmDF6VEatUNjgUZBJKWRqugoISdUv3PPQgHY= -github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= -github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= -github.com/gtank/merlin v0.1.1-0.20191105220539-8318aed1a79f/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= -github.com/gtank/merlin v0.1.1 h1:eQ90iG7K9pOhtereWsmyRJ6RAwcP4tHTDBHXNg+u5is= -github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= -github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc= -github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o= -github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= -github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= -github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= -github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -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.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 v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -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/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3 h1:aSVUgRRRtOrZOC1fYmY9gV0e9z/Iu+xNVSASWjsuyGU= -github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3/go.mod h1:5PC6ZNPde8bBqU/ewGZig35+UIZtw9Ytxez8/q5ZyFE= -github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= -github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= -github.com/huin/goupnp v1.0.3-0.20220313090229-ca81a64b4204/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= -github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= -github.com/iancoleman/orderedmap v0.2.0 h1:sq1N/TFpYH++aViPcaKjys3bDClUEU7s5B+z6jq8pNA= -github.com/iancoleman/orderedmap v0.2.0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= -github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= -github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= -github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= -github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= -github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= -github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= -github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8= -github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= -github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= -github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= -github.com/informalsystems/tendermint v0.34.25 h1:KlTF1ECfJI2KmM1w1YGai5hoLJ0ZOKjVwGAaElEBPtE= -github.com/informalsystems/tendermint v0.34.25/go.mod h1:TCGT4eRe5OW979YKVTpFOM57B4YkN+7FSDWpsgzAGwY= -github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= -github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jgautheron/goconst v1.5.1 h1:HxVbL1MhydKs8R8n/HE5NPvzfaYmQJA3o879lE4+WcM= -github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= -github.com/jhump/protoreflect v1.13.1-0.20220928232736-101791cb1b4c h1:XImQJfpJLmGEEd8ll5yPVyL/aEvmgGHW4WYTyNseLOM= -github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= -github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= -github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af h1:KA9BjwUk7KlCh6S9EAGWBt1oExIUv9WyNCiRz5amv48= -github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= -github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= -github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY= -github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/justinas/alice v1.2.0 h1:+MHSA/vccVCF4Uq37S42jwlkvI2Xzl7zTPCN5BnZNVo= -github.com/justinas/alice v1.2.0/go.mod h1:fN5HRH/reO/zrUflLfTN43t3vXvKzvZIENsNEe7i7qA= -github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= -github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.6.2 h1:uGQ9xI8/pgc9iOoCe7kWQgRE6SBTrCGmTSf0LrEtY7c= -github.com/kisielk/errcheck v1.6.2/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw= -github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkHAIKE/contextcheck v1.1.3 h1:l4pNvrb8JSwRd51ojtcOxOeHJzHek+MtOyXbaR0uvmw= -github.com/kkHAIKE/contextcheck v1.1.3/go.mod h1:PG/cwd6c0705/LM0KTr1acO2gORUxkSVWyLJOFW5qoo= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.10.3/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.15.11 h1:Lcadnb3RKGin4FYM/orgq0qde+nc15E5Cbqg4B9Sx9c= -github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= -github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= -github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kulti/thelper v0.6.3 h1:ElhKf+AlItIu+xGnI990no4cE2+XaSu1ULymV2Yulxs= -github.com/kulti/thelper v0.6.3/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= -github.com/kunwardeep/paralleltest v1.0.6 h1:FCKYMF1OF2+RveWlABsdnmsvJrei5aoyZoaGS+Ugg8g= -github.com/kunwardeep/paralleltest v1.0.6/go.mod h1:Y0Y0XISdZM5IKm3TREQMZ6iteqn1YuwCsJO/0kL9Zes= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/kyoh86/exportloopref v0.1.8 h1:5Ry/at+eFdkX9Vsdw3qU4YkvGtzuVfzT4X7S77LoN/M= -github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg= -github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= -github.com/ldez/gomoddirectives v0.2.3 h1:y7MBaisZVDYmKvt9/l1mjNCiSA1BVn34U0ObUcJwlhA= -github.com/ldez/gomoddirectives v0.2.3/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= -github.com/ldez/tagliatelle v0.3.1 h1:3BqVVlReVUZwafJUwQ+oxbx2BEX2vUG4Yu/NOfMiKiM= -github.com/ldez/tagliatelle v0.3.1/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88= -github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= -github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= -github.com/leonklingele/grouper v1.1.0 h1:tC2y/ygPbMFSBOs3DcyaEMKnnwH7eYKzohOtRrf0SAg= -github.com/leonklingele/grouper v1.1.0/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.6 h1:jbk+ZieJ0D7EVGJYpL9QTz7/YW6UHbmdnZWYyK5cdBs= -github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= -github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= -github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= -github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/lucasjones/reggen v0.0.0-20180717132126-cdb49ff09d77/go.mod h1:5ELEyG+X8f+meRWHuqUOewBOhvHkl7M76pdGEansxW4= -github.com/lufeee/execinquery v1.2.1 h1:hf0Ems4SHcUGBxpGN7Jz78z1ppVkP/837ZlETPCEtOM= -github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= -github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= -github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/maratori/testableexamples v1.0.0 h1:dU5alXRrD8WKSjOUnmJZuzdxWOEQ57+7s93SLMxb2vI= -github.com/maratori/testableexamples v1.0.0/go.mod h1:4rhjL1n20TUTT4vdh3RDqSizKLyXp7K2u6HgraZCGzE= -github.com/maratori/testpackage v1.1.0 h1:GJY4wlzQhuBusMF1oahQCBtUV/AQ/k69IZ68vxaac2Q= -github.com/maratori/testpackage v1.1.0/go.mod h1:PeAhzU8qkCwdGEMTEupsHJNlQu2gZopMC6RjbhmHeDc= -github.com/matoous/godox v0.0.0-20210227103229-6504466cf951 h1:pWxk9e//NbPwfxat7RXkts09K+dEBJWakUWwICVqYbA= -github.com/matoous/godox v0.0.0-20210227103229-6504466cf951/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= -github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= -github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= -github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= -github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mbilski/exhaustivestruct v1.2.0 h1:wCBmUnSYufAHO6J4AVWY6ff+oxWxsVFrwgOdMUQePUo= -github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= -github.com/mgechev/revive v1.2.4 h1:+2Hd/S8oO2H0Ikq2+egtNwQsVhAeELHjxjIUFX5ajLI= -github.com/mgechev/revive v1.2.4/go.mod h1:iAWlQishqCuj4yhV24FTnKSXGpbAA+0SckXB8GQMX/Q= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= -github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 h1:QRUSJEgZn2Snx0EmT/QLXibWjSUDjKWvXIT19NBVp94= -github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= -github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= -github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= -github.com/moricho/tparallel v0.2.1 h1:95FytivzT6rYzdJLdtfn6m1bfFJylOJK41+lgv/EHf4= -github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k= -github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= -github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= -github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= -github.com/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U= -github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= -github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= -github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 h1:4kuARK6Y6FxaNu/BnU2OAaLF86eTVhP2hjTB6iMvItA= -github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= -github.com/neilotoole/errgroup v0.1.6/go.mod h1:Q2nLGf+594h0CLBs/Mbg6qOr7GtqDK7C2S41udRnToE= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nishanths/exhaustive v0.8.3 h1:pw5O09vwg8ZaditDp/nQRqVnrMczSJDxRDJMowvhsrM= -github.com/nishanths/exhaustive v0.8.3/go.mod h1:qj+zJJUgJ76tR92+25+03oYUhzF4R7/2Wk7fGTfCHmg= -github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk= -github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= -github.com/onsi/ginkgo/v2 v2.1.4 h1:GNapqRSid3zijZ9H77KrgVG4/8KqiyRsxcSxe+7ApXY= -github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.20.0 h1:8W0cWlwFkflGPLltQvLRB7ZVD5HuP6ng320w2IS245Q= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.1.0-rc2 h1:2zx/Stx4Wc5pIPDvIxHXvXtQFW/7XWJGmnM7r3wg034= -github.com/opencontainers/runc v1.1.3 h1:vIXrkId+0/J2Ymu2m7VjGvbSlAId9XNRPhn2p4b+d8w= -github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= -github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= -github.com/osmosis-labs/osmosis/osmoutils v0.0.3-rc0 h1:u91mXL0DbbQdLy95gCkLrM6cxya9b53fuiNkLO04KOE= -github.com/osmosis-labs/osmosis/osmoutils v0.0.3-rc0/go.mod h1:rO4YKI0ZQkS3o4UDhFuQFy+j4eM/as8GLvuBDNBStkQ= -github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201151635-ef43e092d196 h1:V8OgwzvHwvGt2yEHRFsiWUPC647qez2LNgcvLzXgw8U= -github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201151635-ef43e092d196/go.mod h1:eoSRNkeqi3ufOmvY8XcW8y0NgbbaPyBTEn7DTxq8XY4= -github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= -github.com/otiai10/copy v1.6.0 h1:IinKAryFFuPONZ7cm6T6E2QX/vcJwSnlaA5lfoaXIiQ= -github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= -github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= -github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= -github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= -github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= -github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= -github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= -github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= -github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= -github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 h1:q2e307iGHPdTGp0hoxKjt1H5pDo6utceo3dQVK3I5XQ= -github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= -github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d h1:CdDQnGF8Nq9ocOS/xlSptM1N3BbrA6/kmaep5ggwaIA= -github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= -github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= -github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= -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/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/polyfloyd/go-errorlint v1.0.5 h1:AHB5JRCjlmelh9RrLxT9sgzpalIwwq4hqE8EkwIwKdY= -github.com/polyfloyd/go-errorlint v1.0.5/go.mod h1:APVvOesVSAnne5SClsPxPdfvZTVDojXh1/G3qb5wjGI= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/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.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -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.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -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.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= -github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30= -github.com/quasilyte/go-ruleguard v0.3.18 h1:sd+abO1PEI9fkYennwzHn9kl3nqP6M5vE7FiOzZ+5CE= -github.com/quasilyte/go-ruleguard v0.3.18/go.mod h1:lOIzcYlgxrQ2sGJ735EHXmf/e9MJ516j16K/Ifcttvs= -github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/dsl v0.3.21/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc= -github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= -github.com/quasilyte/gogrep v0.0.0-20220828223005-86e4605de09f h1:6Gtn2i04RD0gVyYf2/IUMTIs+qYleBt4zxDqkLTcu4U= -github.com/quasilyte/gogrep v0.0.0-20220828223005-86e4605de09f/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng= -github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 h1:L8QM9bvf68pVdQ3bCFZMDmnt9yqcMBro1pC7F+IPYMY= -github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= -github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs= -github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= -github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= -github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/regen-network/cosmos-proto v0.3.1 h1:rV7iM4SSFAagvy8RiyhiACbWEGotmqzywPxOvwMdxcg= -github.com/regen-network/cosmos-proto v0.3.1/go.mod h1:jO0sVX6a1B36nmE8C9xBFXpNwWejXC7QqCOnH3O0+YM= -github.com/regen-network/protobuf v1.3.2-alpha.regen.4 h1:c9jEnU+xm6vqyrQe3M94UFWqiXxRIKKnqBOh2EACmBE= -github.com/regen-network/protobuf v1.3.2-alpha.regen.4/go.mod h1:/J8/bR1T/NXyIdQDLUaq15LjNE83nRzkyrLAMcPewig= -github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= -github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -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.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= -github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/rs/xid v1.4.0 h1:qd7wPTDkN6KQx2VmMBLrpHkiyQwgFXRnkOLacUiaSNY= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.28.0 h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY= -github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryancurrah/gomodguard v1.2.4 h1:CpMSDKan0LtNGGhPrvupAoLeObRFjND8/tU1rEOtBp4= -github.com/ryancurrah/gomodguard v1.2.4/go.mod h1:+Kem4VjWwvFpUJRJSwa16s1tBJe+vbv02+naTow2f6M= -github.com/ryanrolds/sqlclosecheck v0.3.0 h1:AZx+Bixh8zdUBxUA1NxbxVAS78vTPq4rCb8OUZI9xFw= -github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/sanposhiho/wastedassign/v2 v2.0.6 h1:+6/hQIHKNJAUixEj6EmOngGIisyeI+T3335lYTyxRoA= -github.com/sanposhiho/wastedassign/v2 v2.0.6/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= -github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0= -github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= -github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tMEOsumirXcOJqAw= -github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= -github.com/sashamelentyev/usestdlibvars v1.20.0 h1:K6CXjqqtSYSsuyRDDC7Sjn6vTMLiSJa4ZmDkiokoqtw= -github.com/sashamelentyev/usestdlibvars v1.20.0/go.mod h1:0GaP+ecfZMXShS0A94CJn6aEuPRILv8h/VuWI9n1ygg= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/securego/gosec/v2 v2.13.1 h1:7mU32qn2dyC81MH9L2kefnQyRMUarfDER3iQyMHcjYM= -github.com/securego/gosec/v2 v2.13.1/go.mod h1:EO1sImBMBWFjOTFzMWfTRrZW6M15gm60ljzrmy/wtHo= -github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= -github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= -github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU= -github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= -github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/sivchari/containedctx v1.0.2 h1:0hLQKpgC53OVF1VT7CeoFHk9YKstur1XOgfYIc1yrHI= -github.com/sivchari/containedctx v1.0.2/go.mod h1:PwZOeqm4/DLoJOqMSIJs3aKqXRX4YO+uXww087KZ7Bw= -github.com/sivchari/nosnakecase v1.7.0 h1:7QkpWIRMe8x25gckkFd2A5Pi6Ymo0qgr4JrhGt95do8= -github.com/sivchari/nosnakecase v1.7.0/go.mod h1:CwDzrzPea40/GB6uynrNLiorAlgFRvRbFSgJx2Gs+QY= -github.com/sivchari/tenv v1.7.0 h1:d4laZMBK6jpe5PWepxlV9S+LC0yXqvYHiq8E6ceoVVE= -github.com/sivchari/tenv v1.7.0/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/sonatard/noctx v0.0.1 h1:VC1Qhl6Oxx9vvWo3UDgrGXYCeKCe3Wbw7qAWL6FrmTY= -github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI= -github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/sourcegraph/go-diff v0.6.1 h1:hmA1LzxW0n1c3Q4YbrFgg4P99GSnebYa3x8gr0HZqLQ= -github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= -github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= -github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= -github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= -github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= -github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= -github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= -github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= -github.com/stbenjam/no-sprintf-host-port v0.1.1 h1:tYugd/yrm1O0dV+ThCbaKZh195Dfm07ysF0U6JQXczc= -github.com/stbenjam/no-sprintf-host-port v0.1.1/go.mod h1:TLhvtIvONRzdmkFiio4O8LHsN9N74I+PhRquPsxpL0I= -github.com/strangelove-ventures/packet-forward-middleware/v4 v4.0.4 h1:8Tn4Gy/DAq7wzV1CxEGv80ujZ+nUvzgwwdCobO/Gj8Y= -github.com/strangelove-ventures/packet-forward-middleware/v4 v4.0.4/go.mod h1:AG8F5pdk3x1h7PlRvPoMem3623W+w8HJHrWYkVJ51kk= -github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= -github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= -github.com/tdakkota/asciicheck v0.1.1 h1:PKzG7JUTUmVspQTDqtkX9eSiLGossXTybutHwTXuO0A= -github.com/tdakkota/asciicheck v0.1.1/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= -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/tm-db v0.6.8-0.20220506192307-f628bb5dc95b h1:Y3ZPG6gdDCAV2sdGkD759ji/09GzaNu1X3qKTmZIbTo= -github.com/tendermint/tm-db v0.6.8-0.20220506192307-f628bb5dc95b/go.mod h1:ADqbS9NOSnBRK9R2RtYC61CdsHmVMD/yXAzcMuPexbU= -github.com/tenntenn/modver v1.0.1 h1:2klLppGhDgzJrScMpkj9Ujy3rXPUspSjAcev9tSEBgA= -github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= -github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpRQGxTSkNYKJ51yaw6ChIqO+Je8UqsTKN/cDag= -github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= -github.com/tetafro/godot v1.4.11 h1:BVoBIqAf/2QdbFmSwAWnaIqDivZdOV0ZRwEm6jivLKw= -github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= -github.com/tidwall/btree v1.5.0 h1:iV0yVY/frd7r6qGBXfEYs7DH0gTDgrKTrDjS7xt/IyQ= -github.com/tidwall/btree v1.5.0/go.mod h1:LGm8L/DZjPLmeWGjv5kFrY8dL4uVhMmzmmLYmsObdKE= -github.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.14.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tidwall/sjson v1.2.4/go.mod h1:098SZ494YoMWPmMO6ct4dcFnqxwj9r/gF0Etp19pSNM= -github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144 h1:kl4KhGNsJIbDHS9/4U9yQo1UcPQM0kOMJHn29EoH/Ro= -github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= -github.com/timonwong/loggercheck v0.9.3 h1:ecACo9fNiHxX4/Bc02rW2+kaJIAMAes7qJ7JKxt0EZI= -github.com/timonwong/loggercheck v0.9.3/go.mod h1:wUqnk9yAOIKtGA39l1KLE9Iz0QiTocu/YZoOf+OzFdw= -github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= -github.com/tinylib/msgp v1.1.5/go.mod h1:eQsjooMTnV42mHu917E26IogZ2930nFyBQdofk10Udg= -github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= -github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tomarrell/wrapcheck/v2 v2.7.0 h1:J/F8DbSKJC83bAvC6FoZaRjZiZ/iKoueSdrEkmGeacA= -github.com/tomarrell/wrapcheck/v2 v2.7.0/go.mod h1:ao7l5p0aOlUNJKI0qVwB4Yjlqutd0IvAB9Rdwyilxvg= -github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw= -github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= -github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31/go.mod h1:onvgF043R+lC5RZ8IT9rBXDaEDnpnw/Cl+HFiw+v/7Q= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= -github.com/tyler-smith/go-bip39 v1.0.2/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= -github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ultraware/funlen v0.0.3 h1:5ylVWm8wsNwH5aWo9438pwvsK0QiqVuUrt9bn7S/iLA= -github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= -github.com/ultraware/whitespace v0.0.5 h1:hh+/cpIcopyMYbZNVov9iSxvJU3OYQg78Sfaqzi/CzI= -github.com/ultraware/whitespace v0.0.5/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= -github.com/uudashr/gocognit v1.0.6 h1:2Cgi6MweCsdB6kpcVQp7EW4U23iBFQWfTXiWlyp842Y= -github.com/uudashr/gocognit v1.0.6/go.mod h1:nAIUuVBnYU7pcninia3BHOvQkpQCeO76Uscky5BOwcY= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= -github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= -github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM= -github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= -github.com/ybbus/jsonrpc v2.1.2+incompatible/go.mod h1:XJrh1eMSzdIYFbM08flv0wp5G35eRniyeGut1z+LSiE= -github.com/yeya24/promlinter v0.2.0 h1:xFKDQ82orCU5jQujdaD8stOHiv8UN68BSdn2a8u8Y3o= -github.com/yeya24/promlinter v0.2.0/go.mod h1:u54lkmBOZrpEbQQ6gox2zWKKLKu2SGe+2KOiextY+IA= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zondax/hid v0.9.1 h1:gQe66rtmyZ8VeGFcOpbuH3r7erYtNEAezCAYu8LdkJo= -github.com/zondax/hid v0.9.1/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= -github.com/zondax/ledger-go v0.14.1 h1:Pip65OOl4iJ84WTpA4BKChvOufMhhbxED3BaihoZN4c= -github.com/zondax/ledger-go v0.14.1/go.mod h1:fZ3Dqg6qcdXWSOJFKMG8GCTnD7slO/RL2feOQv8K320= -gitlab.com/bosi/decorder v0.2.3 h1:gX4/RgK16ijY8V+BRQHAySfQAb354T7/xQpDB2n10P0= -gitlab.com/bosi/decorder v0.2.3/go.mod h1:9K1RB5+VPNQYtXtTDAzd2OEftsZb1oV0IrJrzChSdGE= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -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.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY= -go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= -golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE= -golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA= -golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= -golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/exp/typeparams v0.0.0-20220827204233-334a2380cb91 h1:Ic/qN6TEifvObMGQy72k0n1LlJr7DjWWEi+MOsDOiSk= -golang.org/x/exp/typeparams v0.0.0-20220827204233-334a2380cb91/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.5.0 h1:GyT4nK/YDHSqa1c4753ouYCDajOYKTja9Xb/OHtgvSw= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -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-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220702020025-31831981b65f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.4.0 h1:O7UWfv5+A2qiuulQk30kVinPoMtoIPeVaKLEgLpVkvg= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190916130336-e45ffcd953cc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200110213125-a7a6caa82ab2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200622203043-20e05c1c8ffa/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200624225443-88f3c62a19ff/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200625211823-6506e20df31f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200831203904-5a2aa26beb65/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201230224404-63754364767c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.9-0.20211228192929-ee1ca4ffc4da/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.4.0 h1:7mTAgkunk3fr4GAloyyCasadO6h9zSsQZbwvcaIciV4= -golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= -gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -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.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200324203455-a04cca1dde73/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef h1:uQ2vjV/sHTsWSqdKeLqmwitzgvjMl7o4IdtHwUDXSJY= -google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -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.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.52.3 h1:pf7sOysg4LdgBqduXveGKrcEwbStiK2rtfghdzlUYDQ= -google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= -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-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.2-0.20220831092852-f930b1dc76e8 h1:KR8+MyP7/qOlV+8Af01LtjL04bu7on42eVsxT4EyBQk= -google.golang.org/protobuf v1.28.2-0.20220831092852-f930b1dc76e8/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= -gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -honnef.co/go/tools v0.3.3 h1:oDx7VAwstgpYpb3wv0oxiZlxY+foCpRAwY7Vk6XpAgA= -honnef.co/go/tools v0.3.3/go.mod h1:jzwdWgg7Jdq75wlfblQxO4neNaFFSvgc1tD5Wv8U0Yw= -mvdan.cc/gofumpt v0.4.0 h1:JVf4NN1mIpHogBj7ABpgOyZc65/UUOkKQFkoURsz4MM= -mvdan.cc/gofumpt v0.4.0/go.mod h1:PljLOHDeZqgS8opHRKLzp2It2VBuSdteAgqUfzMTxlQ= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= -mvdan.cc/unparam v0.0.0-20220706161116-678bad134442 h1:seuXWbRB1qPrS3NQnHmFKLJLtskWyueeIzmLXghMGgk= -mvdan.cc/unparam v0.0.0-20220706161116-678bad134442/go.mod h1:F/Cxw/6mVrNKqrR2YjFf5CaW0Bw4RL8RfbEf4GRggJk= -nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= -nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/price-feeder/main.go b/price-feeder/main.go deleted file mode 100644 index 3e04b4156..000000000 --- a/price-feeder/main.go +++ /dev/null @@ -1,9 +0,0 @@ -package main - -import ( - "github.com/CosmosContracts/juno/price-feeder/cmd" -) - -func main() { - cmd.Execute() -} diff --git a/price-feeder/oracle/client/chain_height.go b/price-feeder/oracle/client/chain_height.go deleted file mode 100644 index 0560f5958..000000000 --- a/price-feeder/oracle/client/chain_height.go +++ /dev/null @@ -1,112 +0,0 @@ -package client - -import ( - "context" - "errors" - "fmt" - "sync" - - "github.com/rs/zerolog" - tmrpcclient "github.com/tendermint/tendermint/rpc/client" - tmctypes "github.com/tendermint/tendermint/rpc/core/types" - tmtypes "github.com/tendermint/tendermint/types" -) - -var ( - errParseEventDataNewBlockHeader = errors.New("error parsing EventDataNewBlockHeader") - queryEventNewBlockHeader = tmtypes.QueryForEvent(tmtypes.EventNewBlockHeader) -) - -// ChainHeight is used to cache the chain height of the -// current node which is being updated each time the -// node sends an event of EventNewBlockHeader. -// It starts a goroutine to subscribe to blockchain new block event and update the cached height. -type ChainHeight struct { - Logger zerolog.Logger - - mtx sync.RWMutex - errGetChainHeight error - lastChainHeight int64 -} - -// NewChainHeight returns a new ChainHeight struct that -// starts a new goroutine subscribed to EventNewBlockHeader. -func NewChainHeight( - ctx context.Context, - rpcClient tmrpcclient.Client, - logger zerolog.Logger, - initialHeight int64, -) (*ChainHeight, error) { - if initialHeight < 1 { - return nil, fmt.Errorf("expected positive initial block height") - } - - if !rpcClient.IsRunning() { - if err := rpcClient.Start(); err != nil { - return nil, err - } - } - - newBlockHeaderSubscription, err := rpcClient.Subscribe( - ctx, tmtypes.EventNewBlockHeader, queryEventNewBlockHeader.String()) - if err != nil { - return nil, err - } - - chainHeight := &ChainHeight{ - Logger: logger.With().Str("oracle_client", "chain_height").Logger(), - errGetChainHeight: nil, - lastChainHeight: initialHeight, - } - - go chainHeight.subscribe(ctx, rpcClient, newBlockHeaderSubscription) - - return chainHeight, nil -} - -// updateChainHeight receives the data to be updated thread safe. -func (chainHeight *ChainHeight) updateChainHeight(blockHeight int64, err error) { - chainHeight.mtx.Lock() - defer chainHeight.mtx.Unlock() - - chainHeight.lastChainHeight = blockHeight - chainHeight.errGetChainHeight = err -} - -// subscribe listens to new blocks being made -// and updates the chain height. -func (chainHeight *ChainHeight) subscribe( - ctx context.Context, - eventsClient tmrpcclient.EventsClient, - newBlockHeaderSubscription <-chan tmctypes.ResultEvent, -) { - for { - select { - case <-ctx.Done(): - err := eventsClient.Unsubscribe(ctx, tmtypes.EventNewBlockHeader, queryEventNewBlockHeader.String()) - if err != nil { - chainHeight.Logger.Err(err) - chainHeight.updateChainHeight(chainHeight.lastChainHeight, err) - } - chainHeight.Logger.Info().Msg("closing the ChainHeight subscription") - return - - case resultEvent := <-newBlockHeaderSubscription: - eventDataNewBlockHeader, ok := resultEvent.Data.(tmtypes.EventDataNewBlockHeader) - if !ok { - chainHeight.Logger.Err(errParseEventDataNewBlockHeader) - chainHeight.updateChainHeight(chainHeight.lastChainHeight, errParseEventDataNewBlockHeader) - continue - } - chainHeight.updateChainHeight(eventDataNewBlockHeader.Header.Height, nil) - } - } -} - -// GetChainHeight returns the last chain height available. -func (chainHeight *ChainHeight) GetChainHeight() (int64, error) { - chainHeight.mtx.RLock() - defer chainHeight.mtx.RUnlock() - - return chainHeight.lastChainHeight, chainHeight.errGetChainHeight -} diff --git a/price-feeder/oracle/client/client.go b/price-feeder/oracle/client/client.go deleted file mode 100644 index 8791a4de1..000000000 --- a/price-feeder/oracle/client/client.go +++ /dev/null @@ -1,293 +0,0 @@ -package client - -import ( - "bytes" - "context" - "errors" - "fmt" - "io" - "os" - "time" - - junoapp "github.com/CosmosContracts/juno/v13/app" - junoparams "github.com/CosmosContracts/juno/v13/app/params" - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/client/rpc" - "github.com/cosmos/cosmos-sdk/client/tx" - "github.com/cosmos/cosmos-sdk/crypto/keyring" - "github.com/cosmos/cosmos-sdk/telemetry" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/tx/signing" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/rs/zerolog" - rpchttp "github.com/tendermint/tendermint/rpc/client/http" - tmjsonclient "github.com/tendermint/tendermint/rpc/jsonrpc/client" -) - -type ( - // OracleClient defines a structure that interfaces with the Juno node. - OracleClient struct { - Logger zerolog.Logger - ChainID string - KeyringBackend string - KeyringDir string - KeyringPass string - TMRPC string - RPCTimeout time.Duration - OracleAddr sdk.AccAddress - OracleAddrString string - ValidatorAddr sdk.ValAddress - ValidatorAddrString string - Encoding junoparams.EncodingConfig - GasPrices string - FeeGrantAddress string - GasAdjustment float64 - GRPCEndpoint string - KeyringPassphrase string - ChainHeight *ChainHeight - } - - passReader struct { - pass string - buf *bytes.Buffer - } -) - -func NewOracleClient( - ctx context.Context, - logger zerolog.Logger, - chainID string, - keyringBackend string, - keyringDir string, - keyringPass string, - tmRPC string, - rpcTimeout time.Duration, - oracleAddrString string, - validatorAddrString string, - grpcEndpoint string, - gasAdjustment float64, - gasPrice string, - feeGrantAddress string, -) (OracleClient, error) { - oracleAddr, err := sdk.AccAddressFromBech32(oracleAddrString) - if err != nil { - return OracleClient{}, err - } - oracleClient := OracleClient{ - Logger: logger.With().Str("module", "oracle_client").Logger(), - ChainID: chainID, - KeyringBackend: keyringBackend, - KeyringDir: keyringDir, - KeyringPass: keyringPass, - TMRPC: tmRPC, - RPCTimeout: rpcTimeout, - OracleAddr: oracleAddr, - OracleAddrString: oracleAddrString, - ValidatorAddr: sdk.ValAddress(validatorAddrString), - ValidatorAddrString: validatorAddrString, - Encoding: junoapp.MakeEncodingConfig(), - GasAdjustment: gasAdjustment, - GRPCEndpoint: grpcEndpoint, - GasPrices: gasPrice, - FeeGrantAddress: feeGrantAddress, - } - - clientCtx, err := oracleClient.CreateClientContext() - if err != nil { - return OracleClient{}, err - } - - blockHeight, err := rpc.GetChainHeight(clientCtx) - if err != nil { - return OracleClient{}, err - } - - chainHeight, err := NewChainHeight( - ctx, - clientCtx.Client, - oracleClient.Logger, - blockHeight, - ) - if err != nil { - return OracleClient{}, err - } - oracleClient.ChainHeight = chainHeight - - return oracleClient, nil -} - -func newPassReader(pass string) io.Reader { - return &passReader{ - pass: pass, - buf: new(bytes.Buffer), - } -} - -func (r *passReader) Read(p []byte) (n int, err error) { - n, err = r.buf.Read(p) - if err == io.EOF || n == 0 { - r.buf.WriteString(r.pass + "\n") - - n, err = r.buf.Read(p) - } - - return n, err -} - -// BroadcastTx attempts to broadcast a signed transaction. If it fails, a few re-attempts -// will be made until the transaction succeeds or ultimately times out or fails. -// Ref: https://github.com/terra-money/oracle-feeder/blob/baef2a4a02f57a2ffeaa207932b2e03d7fb0fb25/feeder/src/vote.ts#L230 -func (oc OracleClient) BroadcastTx(nextBlockHeight, timeoutHeight int64, msgs ...sdk.Msg) error { - maxBlockHeight := nextBlockHeight + timeoutHeight - lastCheckHeight := nextBlockHeight - 1 - - clientCtx, err := oc.CreateClientContext() - if err != nil { - return err - } - - factory, err := oc.CreateTxFactory() - if err != nil { - return err - } - - // re-try voting until timeout - for lastCheckHeight < maxBlockHeight { - latestBlockHeight, err := oc.ChainHeight.GetChainHeight() - if err != nil { - return err - } - - if latestBlockHeight <= lastCheckHeight { - continue - } - - // set last check height to latest block height - lastCheckHeight = latestBlockHeight - if oc.FeeGrantAddress != "" { - feeGrandAccAddress, err := sdk.AccAddressFromBech32(oc.FeeGrantAddress) - if err != nil { - return err - } - clientCtx = clientCtx.WithFeeGranterAddress(feeGrandAccAddress) - } - - resp, err := BroadcastTx(clientCtx, factory, oc.GasPrices, msgs...) - if resp != nil && resp.Code != 0 { - telemetry.IncrCounter(1, "failure", "tx", "code") - err = fmt.Errorf("invalid response code from tx: %d", resp.Code) - } - if err != nil { - var ( - code uint32 - hash string - ) - if resp != nil { - code = resp.Code - hash = resp.TxHash - } - - oc.Logger.Debug(). - Err(err). - Int64("max_height", maxBlockHeight). - Int64("last_check_height", lastCheckHeight). - Str("tx_hash", hash). - Uint32("tx_code", code). - Msg("failed to broadcast tx; retrying...") - - time.Sleep(time.Second * 1) - continue - } - - oc.Logger.Info(). - Uint32("tx_code", resp.Code). - Str("tx_hash", resp.TxHash). - Int64("tx_height", resp.Height). - Msg("successfully broadcasted tx") - - return nil - } - - telemetry.IncrCounter(1, "failure", "tx", "timeout") - return errors.New("broadcasting tx timed out") -} - -// CreateClientContext creates an SDK client Context instance used for transaction -// generation, signing and broadcasting. -func (oc OracleClient) CreateClientContext() (client.Context, error) { - var keyringInput io.Reader - if len(oc.KeyringPass) > 0 { - keyringInput = newPassReader(oc.KeyringPass) - } else { - keyringInput = os.Stdin - } - - kr, err := keyring.New("oracle", oc.KeyringBackend, oc.KeyringDir, keyringInput) - if err != nil { - return client.Context{}, err - } - - httpClient, err := tmjsonclient.DefaultHTTPClient(oc.TMRPC) - if err != nil { - return client.Context{}, err - } - - httpClient.Timeout = oc.RPCTimeout - - tmRPC, err := rpchttp.NewWithClient(oc.TMRPC, "/websocket", httpClient) - if err != nil { - return client.Context{}, err - } - - keyInfo, err := kr.KeyByAddress(oc.OracleAddr) - if err != nil { - return client.Context{}, err - } - clientCtx := client.Context{ - ChainID: oc.ChainID, - InterfaceRegistry: oc.Encoding.InterfaceRegistry, - Output: os.Stderr, - BroadcastMode: flags.BroadcastSync, - TxConfig: oc.Encoding.TxConfig, - AccountRetriever: authtypes.AccountRetriever{}, - Codec: oc.Encoding.Marshaler, - LegacyAmino: oc.Encoding.Amino, - Input: os.Stdin, - NodeURI: oc.TMRPC, - Client: tmRPC, - Keyring: kr, - FromAddress: oc.OracleAddr, - FromName: keyInfo.GetName(), - From: keyInfo.GetName(), - OutputFormat: "json", - UseLedger: false, - Simulate: false, - GenerateOnly: false, - Offline: false, - SkipConfirm: true, - } - - return clientCtx, nil -} - -// CreateTxFactory creates an SDK Factory instance used for transaction -// generation, signing and broadcasting. -func (oc OracleClient) CreateTxFactory() (tx.Factory, error) { - clientCtx, err := oc.CreateClientContext() - if err != nil { - return tx.Factory{}, err - } - - txFactory := tx.Factory{}. - WithAccountRetriever(clientCtx.AccountRetriever). - WithChainID(oc.ChainID). - WithTxConfig(clientCtx.TxConfig). - WithGasAdjustment(oc.GasAdjustment). - WithGasPrices(oc.GasPrices). - WithKeybase(clientCtx.Keyring). - WithSignMode(signing.SignMode_SIGN_MODE_DIRECT). - WithSimulateAndExecute(true) - - return txFactory, nil -} diff --git a/price-feeder/oracle/client/tx.go b/price-feeder/oracle/client/tx.go deleted file mode 100644 index f20ef444b..000000000 --- a/price-feeder/oracle/client/tx.go +++ /dev/null @@ -1,99 +0,0 @@ -package client - -import ( - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/tx" - sdk "github.com/cosmos/cosmos-sdk/types" -) - -// BroadcastTx attempts to generate, sign and broadcast a transaction with the -// given set of messages. It will also simulate gas requirements if necessary. -// It will return an error upon failure. -// -// Note, BroadcastTx is copied from the SDK except it removes a few unnecessary -// things like prompting for confirmation and printing the response. Instead, -// we return the TxResponse. -func BroadcastTx(clientCtx client.Context, txf tx.Factory, gasPrice string, msgs ...sdk.Msg) (*sdk.TxResponse, error) { - txf, err := prepareFactory(clientCtx, txf) - if err != nil { - return nil, err - } - - _, adjusted, err := tx.CalculateGas(clientCtx, txf, msgs...) - if err != nil { - return nil, err - } - - txf = txf.WithGas(adjusted) - - unsignedTx, err := txf.BuildUnsignedTx(msgs...) - if err != nil { - return nil, err - } - - feeAmount, err := calculateFeeAmount(gasPrice, adjusted) - if err != nil { - return nil, err - } - unsignedTx.SetFeeAmount(feeAmount) - unsignedTx.SetFeeGranter(clientCtx.GetFeeGranterAddress()) - - // unsignedTx.SetFeePayer(clientCtx.GetFeePayerAddress()) - - if err = tx.Sign(txf, clientCtx.GetFromName(), unsignedTx, true); err != nil { - return nil, err - } - - txBytes, err := clientCtx.TxConfig.TxEncoder()(unsignedTx.GetTx()) - if err != nil { - return nil, err - } - - return clientCtx.BroadcastTx(txBytes) -} - -// prepareFactory ensures the account defined by ctx.GetFromAddress() exists and -// if the account number and/or the account sequence number are zero (not set), -// they will be queried for and set on the provided Factory. A new Factory with -// the updated fields will be returned. -func prepareFactory(clientCtx client.Context, txf tx.Factory) (tx.Factory, error) { - from := clientCtx.GetFromAddress() - - if err := txf.AccountRetriever().EnsureExists(clientCtx, from); err != nil { - return txf, err - } - - initNum, initSeq := txf.AccountNumber(), txf.Sequence() - if initNum == 0 || initSeq == 0 { - num, seq, err := txf.AccountRetriever().GetAccountNumberSequence(clientCtx, from) - if err != nil { - return txf, err - } - - if initNum == 0 { - txf = txf.WithAccountNumber(num) - } - - if initSeq == 0 { - txf = txf.WithSequence(seq) - } - } - - return txf, nil -} - -func calculateFeeAmount(gasPrice string, gas uint64) (sdk.Coins, error) { - var feeAmount sdk.Coins - coins, err := sdk.ParseDecCoins(gasPrice) - if err != nil { - return nil, err - } - - for _, coin := range coins { - intGas := sdk.NewIntFromUint64(gas) - amount := coin.Amount.Mul(sdk.NewDecFromInt(intGas)).Ceil().TruncateInt() - - feeAmount = append(feeAmount, sdk.NewCoin(coin.Denom, amount)) - } - return feeAmount, nil -} diff --git a/price-feeder/oracle/convert.go b/price-feeder/oracle/convert.go deleted file mode 100644 index 0d8280362..000000000 --- a/price-feeder/oracle/convert.go +++ /dev/null @@ -1,212 +0,0 @@ -package oracle - -import ( - "fmt" - "strings" - - "github.com/CosmosContracts/juno/price-feeder/config" - "github.com/CosmosContracts/juno/price-feeder/oracle/provider" - "github.com/CosmosContracts/juno/price-feeder/oracle/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/rs/zerolog" -) - -// getUSDBasedProviders retrieves which providers for an asset have a USD-based pair, -// given the asset and the map of providers to currency pairs. -func getUSDBasedProviders( - asset string, - providerPairs map[provider.Name][]types.CurrencyPair, -) (map[provider.Name]struct{}, error) { - conversionProviders := make(map[provider.Name]struct{}) - - for provider, pairs := range providerPairs { - for _, pair := range pairs { - if strings.ToUpper(pair.Quote) == config.DenomUSD && strings.ToUpper(pair.Base) == asset { - conversionProviders[provider] = struct{}{} - } - } - } - if len(conversionProviders) == 0 { - return nil, fmt.Errorf("no providers have a usd conversion for this asset") - } - - return conversionProviders, nil -} - -// ConvertCandlesToUSD converts any candles which are not quoted in USD -// to USD by other price feeds. It will also filter out any candles not -// within the deviation threshold set by the config. -// -// Ref: https://github.com/umee-network/umee/blob/4348c3e433df8c37dd98a690e96fc275de609bc1/price-feeder/oracle/filter.go#L41 -func convertCandlesToUSD( - logger zerolog.Logger, - candles provider.AggregatedProviderCandles, - providerPairs map[provider.Name][]types.CurrencyPair, - deviationThresholds map[string]sdk.Dec, -) (provider.AggregatedProviderCandles, error) { - if len(candles) == 0 { - return candles, nil - } - - conversionRates := make(map[string]sdk.Dec) - requiredConversions := make(map[provider.Name]types.CurrencyPair) - - for pairProviderName, pairs := range providerPairs { - for _, pair := range pairs { - if strings.ToUpper(pair.Quote) != config.DenomUSD { - // Get valid providers and use them to generate a USD-based price for this asset. - validProviders, err := getUSDBasedProviders(pair.Quote, providerPairs) - if err != nil { - return nil, err - } - - // Find candles which we can use for conversion, and calculate the tvwap - // to find the conversion rate. - validCandleList := provider.AggregatedProviderCandles{} - for providerName, candleSet := range candles { - if _, ok := validProviders[providerName]; ok { - for base, candle := range candleSet { - if base == pair.Quote { - if _, ok := validCandleList[providerName]; !ok { - validCandleList[providerName] = make(map[string][]types.CandlePrice) - } - - validCandleList[providerName][base] = candle - } - } - } - } - - if len(validCandleList) == 0 { - return nil, fmt.Errorf("there are no valid conversion rates for %s", pair.Quote) - } - - filteredCandles, err := FilterCandleDeviations( - logger, - validCandleList, - deviationThresholds, - ) - if err != nil { - return nil, err - } - - // TODO: we should revise ComputeTVWAP to avoid return empty slices - // Ref: https://github.com/umee-network/umee/issues/1261 - tvwap, err := ComputeTVWAP(filteredCandles) - if err != nil { - return nil, err - } - - cvRate, ok := tvwap[pair.Quote] - if !ok { - return nil, fmt.Errorf("error on computing tvwap for quote: %s, base: %s", pair.Quote, pair.Base) - } - - conversionRates[pair.Quote] = cvRate - requiredConversions[pairProviderName] = pair - } - } - } - - // Convert assets to USD. - for provider, assetMap := range candles { - conversionRate, ok := conversionRates[requiredConversions[provider].Quote] - if !ok { - continue - } - for asset, assetCandles := range assetMap { - if requiredConversions[provider].Base == asset { - for i := range assetCandles { - assetCandles[i].Price = assetCandles[i].Price.Mul( - conversionRate, - ) - } - } - } - } - - return candles, nil -} - -// convertTickersToUSD converts any tickers which are not quoted in USD to USD, -// using the conversion rates of other tickers. It will also filter out any tickers -// not within the deviation threshold set by the config. -// -// Ref: https://github.com/umee-network/umee/blob/4348c3e433df8c37dd98a690e96fc275de609bc1/price-feeder/oracle/filter.go#L41 -func convertTickersToUSD( - logger zerolog.Logger, - tickers provider.AggregatedProviderPrices, - providerPairs map[provider.Name][]types.CurrencyPair, - deviationThresholds map[string]sdk.Dec, -) (provider.AggregatedProviderPrices, error) { - if len(tickers) == 0 { - return tickers, nil - } - - conversionRates := make(map[string]sdk.Dec) - requiredConversions := make(map[provider.Name]types.CurrencyPair) - - for pairProviderName, pairs := range providerPairs { - for _, pair := range pairs { - if strings.ToUpper(pair.Quote) != config.DenomUSD { - // Get valid providers and use them to generate a USD-based price for this asset. - validProviders, err := getUSDBasedProviders(pair.Quote, providerPairs) - if err != nil { - return nil, err - } - - // Find valid candles, and then let's re-compute the tvwap. - validTickerList := provider.AggregatedProviderPrices{} - for providerName, candleSet := range tickers { - // Find tickers which we can use for conversion, and calculate the vwap - // to find the conversion rate. - if _, ok := validProviders[providerName]; ok { - for base, ticker := range candleSet { - if base == pair.Quote { - if _, ok := validTickerList[providerName]; !ok { - validTickerList[providerName] = make(map[string]types.TickerPrice) - } - - validTickerList[providerName][base] = ticker - } - } - } - } - - if len(validTickerList) == 0 { - return nil, fmt.Errorf("there are no valid conversion rates for %s", pair.Quote) - } - - filteredTickers, err := FilterTickerDeviations( - logger, - validTickerList, - deviationThresholds, - ) - if err != nil { - return nil, err - } - - vwap := ComputeVWAP(filteredTickers) - - conversionRates[pair.Quote] = vwap[pair.Quote] - requiredConversions[pairProviderName] = pair - } - } - } - - // Convert assets to USD. - for providerName, assetMap := range tickers { - for asset := range assetMap { - if requiredConversions[providerName].Base == asset { - assetMap[asset] = types.TickerPrice{ - Price: assetMap[asset].Price.Mul( - conversionRates[requiredConversions[providerName].Quote], - ), - Volume: assetMap[asset].Volume, - } - } - } - } - - return tickers, nil -} diff --git a/price-feeder/oracle/convert_test.go b/price-feeder/oracle/convert_test.go deleted file mode 100644 index fcbef334b..000000000 --- a/price-feeder/oracle/convert_test.go +++ /dev/null @@ -1,269 +0,0 @@ -package oracle - -import ( - "testing" - "time" - - "github.com/CosmosContracts/juno/price-feeder/oracle/provider" - "github.com/CosmosContracts/juno/price-feeder/oracle/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/rs/zerolog" - "github.com/stretchr/testify/require" -) - -var ( - atomPrice = sdk.MustNewDecFromStr("29.93") - atomVolume = sdk.MustNewDecFromStr("894123.00") - usdtPrice = sdk.MustNewDecFromStr("0.98") - usdtVolume = sdk.MustNewDecFromStr("894123.00") - - atomPair = types.CurrencyPair{ - Base: "ATOM", - Quote: "USDT", - } - usdtPair = types.CurrencyPair{ - Base: "USDT", - Quote: "USD", - } -) - -func TestGetUSDBasedProviders(t *testing.T) { - providerPairs := make(map[provider.Name][]types.CurrencyPair, 3) - providerPairs[provider.ProviderCoinbase] = []types.CurrencyPair{ - { - Base: "FOO", - Quote: "USD", - }, - } - providerPairs[provider.ProviderHuobi] = []types.CurrencyPair{ - { - Base: "FOO", - Quote: "USD", - }, - } - providerPairs[provider.ProviderKraken] = []types.CurrencyPair{ - { - Base: "FOO", - Quote: "USDT", - }, - } - providerPairs[provider.ProviderBinance] = []types.CurrencyPair{ - { - Base: "USDT", - Quote: "USD", - }, - } - - pairs, err := getUSDBasedProviders("FOO", providerPairs) - require.NoError(t, err) - expectedPairs := map[provider.Name]struct{}{ - provider.ProviderCoinbase: {}, - provider.ProviderHuobi: {}, - } - require.Equal(t, pairs, expectedPairs) - - pairs, err = getUSDBasedProviders("USDT", providerPairs) - require.NoError(t, err) - expectedPairs = map[provider.Name]struct{}{ - provider.ProviderBinance: {}, - } - require.Equal(t, pairs, expectedPairs) - - _, err = getUSDBasedProviders("BAR", providerPairs) - require.Error(t, err) -} - -func TestConvertCandlesToUSD(t *testing.T) { - providerCandles := make(provider.AggregatedProviderCandles, 2) - - binanceCandles := map[string][]types.CandlePrice{ - "ATOM": {{ - Price: atomPrice, - Volume: atomVolume, - TimeStamp: provider.PastUnixTime(1 * time.Minute), - }}, - } - providerCandles[provider.ProviderBinance] = binanceCandles - - krakenCandles := map[string][]types.CandlePrice{ - "USDT": {{ - Price: usdtPrice, - Volume: usdtVolume, - TimeStamp: provider.PastUnixTime(1 * time.Minute), - }}, - } - providerCandles[provider.ProviderKraken] = krakenCandles - - providerPairs := map[provider.Name][]types.CurrencyPair{ - provider.ProviderBinance: {atomPair}, - provider.ProviderKraken: {usdtPair}, - } - - convertedCandles, err := convertCandlesToUSD( - zerolog.Nop(), - providerCandles, - providerPairs, - make(map[string]sdk.Dec), - ) - require.NoError(t, err) - - require.Equal( - t, - atomPrice.Mul(usdtPrice), - convertedCandles[provider.ProviderBinance]["ATOM"][0].Price, - ) -} - -func TestConvertCandlesToUSDFiltering(t *testing.T) { - providerCandles := make(provider.AggregatedProviderCandles, 2) - - binanceCandles := map[string][]types.CandlePrice{ - "ATOM": {{ - Price: atomPrice, - Volume: atomVolume, - TimeStamp: provider.PastUnixTime(1 * time.Minute), - }}, - } - providerCandles[provider.ProviderBinance] = binanceCandles - - krakenCandles := map[string][]types.CandlePrice{ - "USDT": {{ - Price: usdtPrice, - Volume: usdtVolume, - TimeStamp: provider.PastUnixTime(1 * time.Minute), - }}, - } - providerCandles[provider.ProviderKraken] = krakenCandles - - gateCandles := map[string][]types.CandlePrice{ - "USDT": {{ - Price: usdtPrice, - Volume: usdtVolume, - TimeStamp: provider.PastUnixTime(1 * time.Minute), - }}, - } - providerCandles[provider.ProviderGate] = gateCandles - - okxCandles := map[string][]types.CandlePrice{ - "USDT": {{ - Price: sdk.MustNewDecFromStr("100.0"), - Volume: usdtVolume, - TimeStamp: provider.PastUnixTime(1 * time.Minute), - }}, - } - providerCandles[provider.ProviderOkx] = okxCandles - - providerPairs := map[provider.Name][]types.CurrencyPair{ - provider.ProviderBinance: {atomPair}, - provider.ProviderKraken: {usdtPair}, - provider.ProviderGate: {usdtPair}, - provider.ProviderOkx: {usdtPair}, - } - - convertedCandles, err := convertCandlesToUSD( - zerolog.Nop(), - providerCandles, - providerPairs, - make(map[string]sdk.Dec), - ) - require.NoError(t, err) - - require.Equal( - t, - atomPrice.Mul(usdtPrice), - convertedCandles[provider.ProviderBinance]["ATOM"][0].Price, - ) -} - -func TestConvertTickersToUSD(t *testing.T) { - providerPrices := make(provider.AggregatedProviderPrices, 2) - - binanceTickers := map[string]types.TickerPrice{ - "ATOM": { - Price: atomPrice, - Volume: atomVolume, - }, - } - providerPrices[provider.ProviderBinance] = binanceTickers - - krakenTicker := map[string]types.TickerPrice{ - "USDT": { - Price: usdtPrice, - Volume: usdtVolume, - }, - } - providerPrices[provider.ProviderKraken] = krakenTicker - - providerPairs := map[provider.Name][]types.CurrencyPair{ - provider.ProviderBinance: {atomPair}, - provider.ProviderKraken: {usdtPair}, - } - - convertedTickers, err := convertTickersToUSD( - zerolog.Nop(), - providerPrices, - providerPairs, - make(map[string]sdk.Dec), - ) - require.NoError(t, err) - - require.Equal( - t, - atomPrice.Mul(usdtPrice), - convertedTickers[provider.ProviderBinance]["ATOM"].Price, - ) -} - -func TestConvertTickersToUSDFiltering(t *testing.T) { - providerPrices := make(provider.AggregatedProviderPrices, 2) - - binanceTickers := map[string]types.TickerPrice{ - "ATOM": { - Price: atomPrice, - Volume: atomVolume, - }, - } - providerPrices[provider.ProviderBinance] = binanceTickers - - krakenTicker := map[string]types.TickerPrice{ - "USDT": { - Price: usdtPrice, - Volume: usdtVolume, - }, - } - providerPrices[provider.ProviderKraken] = krakenTicker - - gateTicker := map[string]types.TickerPrice{ - "USDT": krakenTicker["USDT"], - } - providerPrices[provider.ProviderGate] = gateTicker - - huobiTicker := map[string]types.TickerPrice{ - "USDT": { - Price: sdk.MustNewDecFromStr("10000"), - Volume: usdtVolume, - }, - } - providerPrices[provider.ProviderHuobi] = huobiTicker - - providerPairs := map[provider.Name][]types.CurrencyPair{ - provider.ProviderBinance: {atomPair}, - provider.ProviderKraken: {usdtPair}, - provider.ProviderGate: {usdtPair}, - provider.ProviderHuobi: {usdtPair}, - } - - covertedDeviation, err := convertTickersToUSD( - zerolog.Nop(), - providerPrices, - providerPairs, - make(map[string]sdk.Dec), - ) - require.NoError(t, err) - - require.Equal( - t, - atomPrice.Mul(usdtPrice), - covertedDeviation[provider.ProviderBinance]["ATOM"].Price, - ) -} diff --git a/price-feeder/oracle/filter.go b/price-feeder/oracle/filter.go deleted file mode 100644 index e8fe57a25..000000000 --- a/price-feeder/oracle/filter.go +++ /dev/null @@ -1,151 +0,0 @@ -package oracle - -import ( - "github.com/CosmosContracts/juno/price-feeder/oracle/provider" - "github.com/CosmosContracts/juno/price-feeder/oracle/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/rs/zerolog" -) - -// defaultDeviationThreshold defines how many 𝜎 a provider can be away -// from the mean without being considered faulty. This can be overridden -// in the config. -var defaultDeviationThreshold = sdk.MustNewDecFromStr("1.0") - -// FilterTickerDeviations finds the standard deviations of the prices of -// all assets, and filters out any providers that are not within 2𝜎 of the mean. -func FilterTickerDeviations( - logger zerolog.Logger, - prices provider.AggregatedProviderPrices, - deviationThresholds map[string]sdk.Dec, -) (provider.AggregatedProviderPrices, error) { - var ( - filteredPrices = make(provider.AggregatedProviderPrices) - priceMap = make(map[provider.Name]map[string]sdk.Dec) - ) - - for providerName, priceTickers := range prices { - p, ok := priceMap[providerName] - if !ok { - p = map[string]sdk.Dec{} - priceMap[providerName] = p - } - for base, tp := range priceTickers { - p[base] = tp.Price - } - } - - deviations, means, err := StandardDeviation(priceMap) - if err != nil { - return nil, err - } - - // We accept any prices that are within (2 * T)𝜎, or for which we couldn't get 𝜎. - // T is defined as the deviation threshold, either set by the config - // or defaulted to 1. - for providerName, priceTickers := range prices { - for base, tp := range priceTickers { - t := defaultDeviationThreshold - if _, ok := deviationThresholds[base]; ok { - t = deviationThresholds[base] - } - - if d, ok := deviations[base]; !ok || isBetween(tp.Price, means[base], d.Mul(t)) { - p, ok := filteredPrices[providerName] - if !ok { - p = map[string]types.TickerPrice{} - filteredPrices[providerName] = p - } - p[base] = tp - } else { - provider.TelemetryFailure(providerName, provider.MessageTypeTicker) - logger.Warn(). - Str("base", base). - Str("provider", string(providerName)). - Str("price", tp.Price.String()). - Msg("provider deviating from other prices") - } - } - } - - return filteredPrices, nil -} - -// FilterCandleDeviations finds the standard deviations of the tvwaps of -// all assets, and filters out any providers that are not within 2𝜎 of the mean. -func FilterCandleDeviations( - logger zerolog.Logger, - candles provider.AggregatedProviderCandles, - deviationThresholds map[string]sdk.Dec, -) (provider.AggregatedProviderCandles, error) { - var ( - filteredCandles = make(provider.AggregatedProviderCandles) - tvwaps = make(map[provider.Name]map[string]sdk.Dec) - ) - - for providerName, priceCandles := range candles { - candlePrices := make(provider.AggregatedProviderCandles) - - for base, cp := range priceCandles { - p, ok := candlePrices[providerName] - if !ok { - p = map[string][]types.CandlePrice{} - candlePrices[providerName] = p - } - p[base] = cp - } - - tvwap, err := ComputeTVWAP(candlePrices) - if err != nil { - return nil, err - } - - for base, asset := range tvwap { - if _, ok := tvwaps[providerName]; !ok { - tvwaps[providerName] = make(map[string]sdk.Dec) - } - - tvwaps[providerName][base] = asset - } - } - - deviations, means, err := StandardDeviation(tvwaps) - if err != nil { - return nil, err - } - - // We accept any prices that are within (2 * T)𝜎, or for which we couldn't get 𝜎. - // T is defined as the deviation threshold, either set by the config - // or defaulted to 1. - for providerName, priceMap := range tvwaps { - for base, price := range priceMap { - t := defaultDeviationThreshold - if _, ok := deviationThresholds[base]; ok { - t = deviationThresholds[base] - } - - if d, ok := deviations[base]; !ok || isBetween(price, means[base], d.Mul(t)) { - p, ok := filteredCandles[providerName] - if !ok { - p = map[string][]types.CandlePrice{} - filteredCandles[providerName] = p - } - p[base] = candles[providerName][base] - } else { - provider.TelemetryFailure(providerName, provider.MessageTypeCandle) - logger.Warn(). - Str("base", base). - Str("provider", string(providerName)). - Str("price", price.String()). - Msg("provider deviating from other candles") - } - } - } - - return filteredCandles, nil -} - -func isBetween(p, mean, margin sdk.Dec) bool { - return p.GTE(mean.Sub(margin)) && - p.LTE(mean.Add(margin)) -} diff --git a/price-feeder/oracle/filter_test.go b/price-feeder/oracle/filter_test.go deleted file mode 100644 index 5e5949870..000000000 --- a/price-feeder/oracle/filter_test.go +++ /dev/null @@ -1,128 +0,0 @@ -package oracle - -import ( - "testing" - "time" - - "github.com/CosmosContracts/juno/price-feeder/oracle/provider" - "github.com/CosmosContracts/juno/price-feeder/oracle/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/rs/zerolog" - "github.com/stretchr/testify/require" -) - -func TestSuccessFilterCandleDeviations(t *testing.T) { - providerCandles := make(provider.AggregatedProviderCandles, 4) - pair := types.CurrencyPair{ - Base: "ATOM", - Quote: "USDT", - } - - atomPrice := sdk.MustNewDecFromStr("29.93") - atomVolume := sdk.MustNewDecFromStr("1994674.34000000") - - atomCandlePrice := []types.CandlePrice{ - { - Price: atomPrice, - Volume: atomVolume, - TimeStamp: provider.PastUnixTime(1 * time.Minute), - }, - } - - providerCandles[provider.ProviderBinance] = map[string][]types.CandlePrice{ - pair.Base: atomCandlePrice, - } - providerCandles[provider.ProviderHuobi] = map[string][]types.CandlePrice{ - pair.Base: atomCandlePrice, - } - providerCandles[provider.ProviderKraken] = map[string][]types.CandlePrice{ - pair.Base: atomCandlePrice, - } - providerCandles[provider.ProviderCoinbase] = map[string][]types.CandlePrice{ - pair.Base: { - { - Price: sdk.MustNewDecFromStr("27.1"), - Volume: atomVolume, - TimeStamp: provider.PastUnixTime(1 * time.Minute), - }, - }, - } - - pricesFiltered, err := FilterCandleDeviations( - zerolog.Nop(), - providerCandles, - make(map[string]sdk.Dec), - ) - - _, ok := pricesFiltered[provider.ProviderCoinbase] - require.NoError(t, err, "It should successfully filter out the provider using candles") - require.False(t, ok, "The filtered candle deviation price at coinbase should be empty") - - customDeviations := make(map[string]sdk.Dec, 1) - customDeviations[pair.Base] = sdk.NewDec(2) - - pricesFilteredCustom, err := FilterCandleDeviations( - zerolog.Nop(), - providerCandles, - customDeviations, - ) - - _, ok = pricesFilteredCustom[provider.ProviderCoinbase] - require.NoError(t, err, "It should successfully not filter out coinbase") - require.True(t, ok, "The filtered candle deviation price of coinbase should remain") -} - -func TestSuccessFilterTickerDeviations(t *testing.T) { - providerTickers := make(provider.AggregatedProviderPrices, 4) - pair := types.CurrencyPair{ - Base: "ATOM", - Quote: "USDT", - } - - atomPrice := sdk.MustNewDecFromStr("29.93") - atomVolume := sdk.MustNewDecFromStr("1994674.34000000") - - atomTickerPrice := types.TickerPrice{ - Price: atomPrice, - Volume: atomVolume, - } - - providerTickers[provider.ProviderBinance] = map[string]types.TickerPrice{ - pair.Base: atomTickerPrice, - } - providerTickers[provider.ProviderHuobi] = map[string]types.TickerPrice{ - pair.Base: atomTickerPrice, - } - providerTickers[provider.ProviderKraken] = map[string]types.TickerPrice{ - pair.Base: atomTickerPrice, - } - providerTickers[provider.ProviderCoinbase] = map[string]types.TickerPrice{ - pair.Base: { - Price: sdk.MustNewDecFromStr("27.1"), - Volume: atomVolume, - }, - } - - pricesFiltered, err := FilterTickerDeviations( - zerolog.Nop(), - providerTickers, - make(map[string]sdk.Dec), - ) - - _, ok := pricesFiltered[provider.ProviderCoinbase] - require.NoError(t, err, "It should successfully filter out the provider using tickers") - require.False(t, ok, "The filtered ticker deviation price at coinbase should be empty") - - customDeviations := make(map[string]sdk.Dec, 1) - customDeviations[pair.Base] = sdk.NewDec(2) - - pricesFilteredCustom, err := FilterTickerDeviations( - zerolog.Nop(), - providerTickers, - customDeviations, - ) - - _, ok = pricesFilteredCustom[provider.ProviderCoinbase] - require.NoError(t, err, "It should successfully not filter out coinbase") - require.True(t, ok, "The filtered candle deviation price of coinbase should remain") -} diff --git a/price-feeder/oracle/grpc.go b/price-feeder/oracle/grpc.go deleted file mode 100644 index 64e17fbb9..000000000 --- a/price-feeder/oracle/grpc.go +++ /dev/null @@ -1,34 +0,0 @@ -package oracle - -import ( - "context" - "net" - "strings" -) - -func dialerFunc(ctx context.Context, addr string) (net.Conn, error) { - return Connect(addr) -} - -// Connect dials the given address and returns a net.Conn. The protoAddr -// argument should be prefixed with the protocol, -// eg. "tcp://127.0.0.1:8080" or "unix:///tmp/test.sock". -func Connect(protoAddr string) (net.Conn, error) { - proto, address := ProtocolAndAddress(protoAddr) - conn, err := net.Dial(proto, address) - return conn, err -} - -// ProtocolAndAddress splits an address into the protocol and address components. -// For instance, "tcp://127.0.0.1:8080" will be split into "tcp" and "127.0.0.1:8080". -// If the address has no protocol prefix, the default is "tcp". -func ProtocolAndAddress(listenAddr string) (string, string) { - protocol, address := "tcp", listenAddr - - parts := strings.SplitN(address, "://", 2) - if len(parts) == 2 { - protocol, address = parts[0], parts[1] - } - - return protocol, address -} diff --git a/price-feeder/oracle/oracle.go b/price-feeder/oracle/oracle.go deleted file mode 100644 index 5ed271f47..000000000 --- a/price-feeder/oracle/oracle.go +++ /dev/null @@ -1,670 +0,0 @@ -package oracle - -import ( - "context" - "crypto/rand" - "encoding/hex" - "fmt" - "math" - "sort" - "strings" - "sync" - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/rs/zerolog" - "golang.org/x/sync/errgroup" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" - - "github.com/CosmosContracts/juno/price-feeder/config" - "github.com/CosmosContracts/juno/price-feeder/oracle/client" - "github.com/CosmosContracts/juno/price-feeder/oracle/provider" - "github.com/CosmosContracts/juno/price-feeder/oracle/types" - pfsync "github.com/CosmosContracts/juno/price-feeder/pkg/sync" - oracletypes "github.com/CosmosContracts/juno/v13/x/oracle/types" - "github.com/cosmos/cosmos-sdk/telemetry" -) - -// We define tickerSleep as the minimum timeout between each oracle loop. We -// define this value empirically based on enough time to collect exchange rates, -// and broadcast pre-vote and vote transactions such that they're committed in -// at least one block during each voting period. -const ( - tickerSleep = 1000 * time.Millisecond -) - -// PreviousPrevote defines a structure for defining the previous prevote -// submitted on-chain. -type PreviousPrevote struct { - ExchangeRates string - Salt string - SubmitBlockHeight int64 -} - -func NewPreviousPrevote() *PreviousPrevote { - return &PreviousPrevote{ - Salt: "", - ExchangeRates: "", - SubmitBlockHeight: 0, - } -} - -// Oracle implements the core component responsible for fetching exchange rates -// for a given set of currency pairs and determining the correct exchange rates -// to submit to the on-chain price oracle adhering the oracle specification. -type Oracle struct { - logger zerolog.Logger - closer *pfsync.Closer - - providerTimeout time.Duration - providerPairs map[provider.Name][]types.CurrencyPair - previousPrevote *PreviousPrevote - previousVotePeriod float64 - priceProviders map[provider.Name]provider.Provider - oracleClient client.OracleClient - deviations map[string]sdk.Dec - endpoints map[provider.Name]provider.Endpoint - paramCache ParamCache - - pricesMutex sync.RWMutex - lastPriceSyncTS time.Time - prices map[string]sdk.Dec - - tvwapsByProvider PricesWithMutex - vwapsByProvider PricesWithMutex -} - -func New( - logger zerolog.Logger, - oc client.OracleClient, - currencyPairs []config.CurrencyPair, - providerTimeout time.Duration, - deviations map[string]sdk.Dec, - endpoints map[provider.Name]provider.Endpoint, -) *Oracle { - providerPairs := make(map[provider.Name][]types.CurrencyPair) - - for _, pair := range currencyPairs { - for _, provider := range pair.Providers { - providerPairs[provider] = append(providerPairs[provider], types.CurrencyPair{ - Base: pair.Base, - Quote: pair.Quote, - }) - } - } - - return &Oracle{ - logger: logger.With().Str("module", "oracle").Logger(), - closer: pfsync.NewCloser(), - oracleClient: oc, - providerPairs: providerPairs, - priceProviders: make(map[provider.Name]provider.Provider), - previousPrevote: nil, - providerTimeout: providerTimeout, - deviations: deviations, - paramCache: ParamCache{}, - endpoints: endpoints, - } -} - -// Start starts the oracle process in a blocking fashion. -func (o *Oracle) Start(ctx context.Context) error { - for { - select { - case <-ctx.Done(): - o.closer.Close() - - default: - o.logger.Debug().Msg("starting oracle tick") - - startTime := time.Now() - - if err := o.tick(ctx); err != nil { - telemetry.IncrCounter(1, "failure", "tick") - o.logger.Err(err).Msg("oracle tick failed") - } - - o.lastPriceSyncTS = time.Now() - - telemetry.MeasureSince(startTime, "runtime", "tick") - telemetry.IncrCounter(1, "new", "tick") - - time.Sleep(tickerSleep) - } - } -} - -// Stop stops the oracle process and waits for it to gracefully exit. -func (o *Oracle) Stop() { - o.closer.Close() - <-o.closer.Done() -} - -// GetLastPriceSyncTimestamp returns the latest timestamp at which prices where -// fetched from the oracle's set of exchange rate providers. -func (o *Oracle) GetLastPriceSyncTimestamp() time.Time { - o.pricesMutex.RLock() - defer o.pricesMutex.RUnlock() - - return o.lastPriceSyncTS -} - -// GetPrices returns a copy of the current prices fetched from the oracle's -// set of exchange rate providers. -func (o *Oracle) GetPrices() map[string]sdk.Dec { - o.pricesMutex.RLock() - defer o.pricesMutex.RUnlock() - - // Creates a new array for the prices in the oracle - prices := make(map[string]sdk.Dec, len(o.prices)) - for k, v := range o.prices { - // Fills in the prices with each value in the oracle - prices[k] = v - } - - return prices -} - -// GetTvwapPrices returns a copy of the tvwapsByProvider map -func (o *Oracle) GetTvwapPrices() PricesByProvider { - return o.tvwapsByProvider.GetPricesClone() -} - -// GetVwapPrices returns the vwapsByProvider map using a read lock -func (o *Oracle) GetVwapPrices() PricesByProvider { - return o.vwapsByProvider.GetPricesClone() -} - -// SetPrices retrieves all the prices and candles from our set of providers as -// determined in the config. If candles are available, uses TVWAP in order -// to determine prices. If candles are not available, uses the most recent prices -// with VWAP. Warns the the user of any missing prices, and filters out any faulty -// providers which do not report prices or candles within 2𝜎 of the others. -func (o *Oracle) SetPrices(ctx context.Context) error { - g := new(errgroup.Group) - mtx := new(sync.Mutex) - providerPrices := make(provider.AggregatedProviderPrices) - providerCandles := make(provider.AggregatedProviderCandles) - requiredRates := make(map[string]struct{}) - - for providerName, currencyPairs := range o.providerPairs { - providerName := providerName - currencyPairs := currencyPairs - - priceProvider, err := o.getOrSetProvider(ctx, providerName) - if err != nil { - return err - } - - for _, pair := range currencyPairs { - if _, ok := requiredRates[pair.Base]; !ok { - requiredRates[pair.Base] = struct{}{} - } - } - - g.Go(func() error { - prices := make(map[string]types.TickerPrice, 0) - candles := make(map[string][]types.CandlePrice, 0) - ch := make(chan struct{}) - errCh := make(chan error, 1) - - go func() { - defer close(ch) - prices, err = priceProvider.GetTickerPrices(currencyPairs...) - if err != nil { - provider.TelemetryFailure(providerName, provider.MessageTypeTicker) - errCh <- err - } - - candles, err = priceProvider.GetCandlePrices(currencyPairs...) - if err != nil { - provider.TelemetryFailure(providerName, provider.MessageTypeCandle) - errCh <- err - } - }() - - select { - case <-ch: - break - case err := <-errCh: - return err - case <-time.After(o.providerTimeout): - telemetry.IncrCounter(1, "failure", "provider", "type", "timeout") - return fmt.Errorf("provider %v timed out", priceProvider) - } - - // flatten and collect prices based on the base currency per provider - // - // e.g.: {ProviderKraken: {"ATOM": , ...}} - mtx.Lock() - for _, pair := range currencyPairs { - success := SetProviderTickerPricesAndCandles(providerName, providerPrices, providerCandles, prices, candles, pair) - if !success { - mtx.Unlock() - return fmt.Errorf("failed to find any exchange rates in provider responses") - } - } - - mtx.Unlock() - return nil - }) - } - - if err := g.Wait(); err != nil { - o.logger.Err(err).Msg("failed to get ticker prices from provider") - } - - computedPrices, err := o.GetComputedPrices( - providerCandles, - providerPrices, - o.providerPairs, - o.deviations, - ) - if err != nil { - return err - } - - if len(computedPrices) != len(requiredRates) { - return fmt.Errorf("unable to get prices for all exchange candles") - } - for base := range requiredRates { - if _, ok := computedPrices[base]; !ok { - return fmt.Errorf("reported prices were not equal to required rates, missed: %s", base) - } - } - - o.pricesMutex.Lock() - o.prices = computedPrices - o.pricesMutex.Unlock() - return nil -} - -// GetComputedPrices gets the candle and ticker prices and computes it. -// It returns candles' TVWAP if possible, if not possible (not available -// or due to some staleness) it will use the most recent ticker prices -// and the VWAP formula instead. -func (o *Oracle) GetComputedPrices( - providerCandles provider.AggregatedProviderCandles, - providerPrices provider.AggregatedProviderPrices, - providerPairs map[provider.Name][]types.CurrencyPair, - deviations map[string]sdk.Dec, -) (prices map[string]sdk.Dec, err error) { - // convert any non-USD denominated candles into USD - convertedCandles, err := convertCandlesToUSD( - o.logger, - providerCandles, - providerPairs, - deviations, - ) - if err != nil { - return nil, err - } - - // filter out any erroneous candles - filteredCandles, err := FilterCandleDeviations( - o.logger, - convertedCandles, - deviations, - ) - if err != nil { - return nil, err - } - - computedPrices, _ := ComputeTvwapsByProvider(filteredCandles) - o.tvwapsByProvider.SetPrices(computedPrices) - - // attempt to use candles for TVWAP calculations - tvwapPrices, err := ComputeTVWAP(filteredCandles) - if err != nil { - return nil, err - } - - // If TVWAP candles are not available or were filtered out due to staleness, - // use most recent prices & VWAP instead. - if len(tvwapPrices) == 0 { - convertedTickers, err := convertTickersToUSD( - o.logger, - providerPrices, - providerPairs, - deviations, - ) - if err != nil { - return nil, err - } - - filteredProviderPrices, err := FilterTickerDeviations( - o.logger, - convertedTickers, - deviations, - ) - if err != nil { - return nil, err - } - - o.vwapsByProvider.SetPrices(ComputeVwapsByProvider(filteredProviderPrices)) - - vwapPrices := ComputeVWAP(filteredProviderPrices) - - return vwapPrices, nil - } - - return tvwapPrices, nil -} - -// SetProviderTickerPricesAndCandles flattens and collects prices for -// candles and tickers based on the base currency per provider. -// Returns true if at least one of price or candle exists. -func SetProviderTickerPricesAndCandles( - providerName provider.Name, - providerPrices provider.AggregatedProviderPrices, - providerCandles provider.AggregatedProviderCandles, - prices map[string]types.TickerPrice, - candles map[string][]types.CandlePrice, - pair types.CurrencyPair, -) (success bool) { - if _, ok := providerPrices[providerName]; !ok { - providerPrices[providerName] = make(map[string]types.TickerPrice) - } - if _, ok := providerCandles[providerName]; !ok { - providerCandles[providerName] = make(map[string][]types.CandlePrice) - } - - tp, pricesOk := prices[pair.String()] - cp, candlesOk := candles[pair.String()] - - if pricesOk { - providerPrices[providerName][pair.Base] = tp - } - if candlesOk { - providerCandles[providerName][pair.Base] = cp - } - - return pricesOk || candlesOk -} - -// GetParamCache returns the last updated parameters of the x/oracle module -// if the current ParamCache is outdated, we will query it again. -func (o *Oracle) GetParamCache(ctx context.Context, currentBlockHeigh int64) (oracletypes.Params, error) { - if !o.paramCache.IsOutdated(currentBlockHeigh) { - return *o.paramCache.params, nil - } - - params, err := o.GetParams(ctx) - if err != nil { - return oracletypes.Params{}, err - } - - o.checkWhitelist(params) - o.paramCache.Update(currentBlockHeigh, params) - return params, nil -} - -// GetParams returns the current on-chain parameters of the x/oracle module. -func (o *Oracle) GetParams(ctx context.Context) (oracletypes.Params, error) { - grpcConn, err := grpc.Dial( - o.oracleClient.GRPCEndpoint, - // the Cosmos SDK doesn't support any transport security mechanism - grpc.WithTransportCredentials(insecure.NewCredentials()), - grpc.WithContextDialer(dialerFunc), - ) - if err != nil { - return oracletypes.Params{}, fmt.Errorf("failed to dial Cosmos gRPC service: %w", err) - } - - defer grpcConn.Close() - queryClient := oracletypes.NewQueryClient(grpcConn) - - ctx, cancel := context.WithTimeout(ctx, 15*time.Second) - defer cancel() - - queryResponse, err := queryClient.Params(ctx, &oracletypes.QueryParams{}) - if err != nil { - return oracletypes.Params{}, fmt.Errorf("failed to get x/oracle params: %w", err) - } - - return queryResponse.Params, nil -} - -func (o *Oracle) getOrSetProvider(ctx context.Context, providerName provider.Name) (provider.Provider, error) { - var ( - priceProvider provider.Provider - ok bool - ) - - priceProvider, ok = o.priceProviders[providerName] - if !ok { - newProvider, err := NewProvider( - ctx, - providerName, - o.logger, - o.endpoints[providerName], - o.providerPairs[providerName]..., - ) - if err != nil { - return nil, err - } - priceProvider = newProvider - - o.priceProviders[providerName] = priceProvider - } - - return priceProvider, nil -} - -func NewProvider( - ctx context.Context, - providerName provider.Name, - logger zerolog.Logger, - endpoint provider.Endpoint, - providerPairs ...types.CurrencyPair, -) (provider.Provider, error) { - switch providerName { - case provider.ProviderBinance: - return provider.NewBinanceProvider(ctx, logger, endpoint, providerPairs...) - - case provider.ProviderKraken: - return provider.NewKrakenProvider(ctx, logger, endpoint, providerPairs...) - - case provider.ProviderOsmosis: - return provider.NewOsmosisProvider(endpoint), nil - - case provider.ProviderJuno: - return provider.NewJunoProvider(endpoint), nil - - case provider.ProviderHuobi: - return provider.NewHuobiProvider(ctx, logger, endpoint, providerPairs...) - - case provider.ProviderCoinbase: - return provider.NewCoinbaseProvider(ctx, logger, endpoint, providerPairs...) - - case provider.ProviderOkx: - return provider.NewOkxProvider(ctx, logger, endpoint, providerPairs...) - - case provider.ProviderGate: - return provider.NewGateProvider(ctx, logger, endpoint, providerPairs...) - - case provider.ProviderBitget: - return provider.NewBitgetProvider(ctx, logger, endpoint, providerPairs...) - - case provider.ProviderMexc: - return provider.NewMexcProvider(ctx, logger, endpoint, providerPairs...) - - case provider.ProviderCrypto: - return provider.NewCryptoProvider(ctx, logger, endpoint, providerPairs...) - - case provider.ProviderMock: - return provider.NewMockProvider(), nil - } - - return nil, fmt.Errorf("provider %s not found", providerName) -} - -func (o *Oracle) checkWhitelist(params oracletypes.Params) { - for _, denom := range params.Whitelist { - symbol := strings.ToUpper(denom.SymbolDenom) - if _, ok := o.prices[symbol]; !ok { - o.logger.Warn().Str("denom", symbol).Msg("price missing for required denom") - } - } -} - -func (o *Oracle) tick(ctx context.Context) error { - o.logger.Debug().Msg("executing oracle tick") - - blockHeight, err := o.oracleClient.ChainHeight.GetChainHeight() - if err != nil { - return err - } - if blockHeight < 1 { - return fmt.Errorf("expected positive block height") - } - - oracleParams, err := o.GetParamCache(ctx, blockHeight) - if err != nil { - return err - } - - if err := o.SetPrices(ctx); err != nil { - return err - } - - // Get oracle vote period, next block height, current vote period, and index - // in the vote period. - oracleVotePeriod := int64(oracleParams.VotePeriod) - nextBlockHeight := blockHeight + 1 - currentVotePeriod := math.Floor(float64(nextBlockHeight) / float64(oracleVotePeriod)) - indexInVotePeriod := nextBlockHeight % oracleVotePeriod - - // Skip until new voting period. Specifically, skip when: - // index [0, oracleVotePeriod - 1] > oracleVotePeriod - 2 OR index is 0 - if (o.previousVotePeriod != 0 && currentVotePeriod == o.previousVotePeriod) || - oracleVotePeriod-indexInVotePeriod < 2 { - o.logger.Info(). - Int64("vote_period", oracleVotePeriod). - Float64("previous_vote_period", o.previousVotePeriod). - Float64("current_vote_period", currentVotePeriod). - Msg("skipping until next voting period") - - return nil - } - - // If we're past the voting period we needed to hit, reset and submit another - // prevote. - if o.previousVotePeriod != 0 && currentVotePeriod-o.previousVotePeriod != 1 { - o.logger.Info(). - Int64("vote_period", oracleVotePeriod). - Float64("previous_vote_period", o.previousVotePeriod). - Float64("current_vote_period", currentVotePeriod). - Msg("missing vote during voting period") - telemetry.IncrCounter(1, "vote", "failure", "missed") - - o.previousVotePeriod = 0 - o.previousPrevote = nil - return nil - } - - salt, err := GenerateSalt(32) - if err != nil { - return err - } - - valAddr, err := sdk.ValAddressFromBech32(o.oracleClient.ValidatorAddrString) - if err != nil { - return err - } - - exchangeRatesStr := GenerateExchangeRatesString(o.prices) - hash := oracletypes.GetAggregateVoteHash(salt, exchangeRatesStr, valAddr) - preVoteMsg := &oracletypes.MsgAggregateExchangeRatePrevote{ - Hash: hash.String(), // hash of prices from the oracle - Feeder: o.oracleClient.OracleAddrString, - Validator: valAddr.String(), - } - - isPrevoteOnlyTx := o.previousPrevote == nil - if isPrevoteOnlyTx { - // This timeout could be as small as oracleVotePeriod-indexInVotePeriod, - // but we give it some extra time just in case. - // - // Ref : https://github.com/terra-money/oracle-feeder/blob/baef2a4a02f57a2ffeaa207932b2e03d7fb0fb25/feeder/src/vote.ts#L222 - o.logger.Info(). - Str("hash", hash.String()). - Str("validator", preVoteMsg.Validator). - Str("feeder", preVoteMsg.Feeder). - Msg("broadcasting pre-vote") - if err := o.oracleClient.BroadcastTx(nextBlockHeight, oracleVotePeriod*2, preVoteMsg); err != nil { - return err - } - - currentHeight, err := o.oracleClient.ChainHeight.GetChainHeight() - if err != nil { - return err - } - - o.previousVotePeriod = math.Floor(float64(currentHeight) / float64(oracleVotePeriod)) - o.previousPrevote = &PreviousPrevote{ - Salt: salt, - ExchangeRates: exchangeRatesStr, - SubmitBlockHeight: currentHeight, - } - } else { - // otherwise, we're in the next voting period and thus we vote - voteMsg := &oracletypes.MsgAggregateExchangeRateVote{ - Salt: o.previousPrevote.Salt, - ExchangeRates: o.previousPrevote.ExchangeRates, - Feeder: o.oracleClient.OracleAddrString, - Validator: valAddr.String(), - } - - o.logger.Info(). - Str("exchange_rates", voteMsg.ExchangeRates). - Str("validator", voteMsg.Validator). - Str("feeder", voteMsg.Feeder). - Msg("broadcasting vote") - if err := o.oracleClient.BroadcastTx( - nextBlockHeight, - oracleVotePeriod-indexInVotePeriod, - voteMsg, - ); err != nil { - return err - } - - o.previousPrevote = nil - o.previousVotePeriod = 0 - } - - return nil -} - -// GenerateSalt generates a random salt, size length/2, as a HEX encoded string. -func GenerateSalt(length int) (string, error) { - if length == 0 { - return "", fmt.Errorf("failed to generate salt: zero length") - } - - bytes := make([]byte, length) - - if _, err := rand.Read(bytes); err != nil { - return "", err - } - - return hex.EncodeToString(bytes), nil -} - -// GenerateExchangeRatesString generates a canonical string representation of -// the aggregated exchange rates. -func GenerateExchangeRatesString(prices map[string]sdk.Dec) string { - exchangeRates := make([]string, len(prices)) - i := 0 - - // aggregate exchange rates as ":" - for base, avgPrice := range prices { - exchangeRates[i] = fmt.Sprintf("%s:%s", base, avgPrice.String()) - i++ - } - - sort.Strings(exchangeRates) - - return strings.Join(exchangeRates, ",") -} diff --git a/price-feeder/oracle/oracle_test.go b/price-feeder/oracle/oracle_test.go deleted file mode 100644 index 71e2b8c74..000000000 --- a/price-feeder/oracle/oracle_test.go +++ /dev/null @@ -1,812 +0,0 @@ -package oracle - -import ( - "context" - "fmt" - "testing" - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/rs/zerolog" - "github.com/stretchr/testify/require" - "github.com/stretchr/testify/suite" - - "github.com/CosmosContracts/juno/price-feeder/config" - "github.com/CosmosContracts/juno/price-feeder/oracle/client" - "github.com/CosmosContracts/juno/price-feeder/oracle/provider" - "github.com/CosmosContracts/juno/price-feeder/oracle/types" -) - -type mockProvider struct { - prices map[string]types.TickerPrice -} - -func (m mockProvider) GetTickerPrices(_ ...types.CurrencyPair) (map[string]types.TickerPrice, error) { - return m.prices, nil -} - -func (m mockProvider) GetCandlePrices(_ ...types.CurrencyPair) (map[string][]types.CandlePrice, error) { - candles := make(map[string][]types.CandlePrice) - for pair, price := range m.prices { - candles[pair] = []types.CandlePrice{ - { - Price: price.Price, - TimeStamp: provider.PastUnixTime(1 * time.Minute), - Volume: price.Volume, - }, - } - } - return candles, nil -} - -func (m mockProvider) SubscribeCurrencyPairs(_ ...types.CurrencyPair) error { - return nil -} - -func (m mockProvider) GetAvailablePairs() (map[string]struct{}, error) { - return map[string]struct{}{}, nil -} - -type failingProvider struct { - prices map[string]types.TickerPrice -} - -func (m failingProvider) GetTickerPrices(_ ...types.CurrencyPair) (map[string]types.TickerPrice, error) { - return nil, fmt.Errorf("unable to get ticker prices") -} - -func (m failingProvider) GetCandlePrices(_ ...types.CurrencyPair) (map[string][]types.CandlePrice, error) { - return nil, fmt.Errorf("unable to get candle prices") -} - -func (m failingProvider) SubscribeCurrencyPairs(_ ...types.CurrencyPair) error { - return nil -} - -func (m failingProvider) GetAvailablePairs() (map[string]struct{}, error) { - return map[string]struct{}{}, nil -} - -type OracleTestSuite struct { - suite.Suite - - oracle *Oracle -} - -// SetupSuite executes once before the suite's tests are executed. -func (ots *OracleTestSuite) SetupSuite() { - ots.oracle = New( - zerolog.Nop(), - client.OracleClient{}, - []config.CurrencyPair{ - { - Base: "JUNO", - Quote: "USDT", - Providers: []provider.Name{provider.ProviderBinance}, - }, - { - Base: "JUNO", - Quote: "USDC", - Providers: []provider.Name{provider.ProviderKraken}, - }, - { - Base: "XBT", - Quote: "USDT", - Providers: []provider.Name{provider.ProviderOsmosis}, - }, - { - Base: "USDC", - Quote: "USD", - Providers: []provider.Name{provider.ProviderHuobi}, - }, - { - Base: "USDT", - Quote: "USD", - Providers: []provider.Name{provider.ProviderCoinbase}, - }, - }, - time.Millisecond*100, - make(map[string]sdk.Dec), - make(map[provider.Name]provider.Endpoint), - ) -} - -func TestServiceTestSuite(t *testing.T) { - suite.Run(t, new(OracleTestSuite)) -} - -func (ots *OracleTestSuite) TestStop() { - ots.Eventually( - func() bool { - ots.oracle.Stop() - return true - }, - 5*time.Second, - time.Second, - ) -} - -func (ots *OracleTestSuite) TestGetLastPriceSyncTimestamp() { - // when no tick() has been invoked, assume zero value - ots.Require().Equal(time.Time{}, ots.oracle.GetLastPriceSyncTimestamp()) -} - -func (ots *OracleTestSuite) TestPrices() { - // initial prices should be empty (not set) - ots.Require().Empty(ots.oracle.GetPrices()) - - // Use a mock provider with exchange rates that are not specified in - // configuration. - ots.oracle.priceProviders = map[provider.Name]provider.Provider{ - provider.ProviderBinance: mockProvider{ - prices: map[string]types.TickerPrice{ - "JUNOUSDX": { - Price: sdk.MustNewDecFromStr("3.72"), - Volume: sdk.MustNewDecFromStr("2396974.02000000"), - }, - }, - }, - provider.ProviderKraken: mockProvider{ - prices: map[string]types.TickerPrice{ - "JUNOUSDX": { - Price: sdk.MustNewDecFromStr("3.70"), - Volume: sdk.MustNewDecFromStr("1994674.34000000"), - }, - }, - }, - } - - ots.Require().Error(ots.oracle.SetPrices(context.TODO())) - ots.Require().Empty(ots.oracle.GetPrices()) - - // use a mock provider without a conversion rate for these stablecoins - ots.oracle.priceProviders = map[provider.Name]provider.Provider{ - provider.ProviderBinance: mockProvider{ - prices: map[string]types.TickerPrice{ - "JUNOUSDT": { - Price: sdk.MustNewDecFromStr("3.72"), - Volume: sdk.MustNewDecFromStr("2396974.02000000"), - }, - }, - }, - provider.ProviderKraken: mockProvider{ - prices: map[string]types.TickerPrice{ - "JUNOUSDC": { - Price: sdk.MustNewDecFromStr("3.70"), - Volume: sdk.MustNewDecFromStr("1994674.34000000"), - }, - }, - }, - } - - ots.Require().Error(ots.oracle.SetPrices(context.TODO())) - - prices := ots.oracle.GetPrices() - ots.Require().Len(prices, 0) - - // use a mock provider to provide prices for the configured exchange pairs - ots.oracle.priceProviders = map[provider.Name]provider.Provider{ - provider.ProviderBinance: mockProvider{ - prices: map[string]types.TickerPrice{ - "JUNOUSDT": { - Price: sdk.MustNewDecFromStr("3.72"), - Volume: sdk.MustNewDecFromStr("2396974.02000000"), - }, - }, - }, - provider.ProviderKraken: mockProvider{ - prices: map[string]types.TickerPrice{ - "JUNOUSDC": { - Price: sdk.MustNewDecFromStr("3.70"), - Volume: sdk.MustNewDecFromStr("1994674.34000000"), - }, - }, - }, - provider.ProviderHuobi: mockProvider{ - prices: map[string]types.TickerPrice{ - "USDCUSD": { - Price: sdk.MustNewDecFromStr("1"), - Volume: sdk.MustNewDecFromStr("2396974.34000000"), - }, - }, - }, - provider.ProviderCoinbase: mockProvider{ - prices: map[string]types.TickerPrice{ - "USDTUSD": { - Price: sdk.MustNewDecFromStr("1"), - Volume: sdk.MustNewDecFromStr("1994674.34000000"), - }, - }, - }, - provider.ProviderOsmosis: mockProvider{ - prices: map[string]types.TickerPrice{ - "XBTUSDT": { - Price: sdk.MustNewDecFromStr("3.717"), - Volume: sdk.MustNewDecFromStr("1994674.34000000"), - }, - }, - }, - } - - ots.Require().NoError(ots.oracle.SetPrices(context.TODO())) - - prices = ots.oracle.GetPrices() - ots.Require().Len(prices, 4) - ots.Require().Equal(sdk.MustNewDecFromStr("3.710916056220858266"), prices["JUNO"]) - ots.Require().Equal(sdk.MustNewDecFromStr("3.717"), prices["XBT"]) - ots.Require().Equal(sdk.MustNewDecFromStr("1"), prices["USDC"]) - ots.Require().Equal(sdk.MustNewDecFromStr("1"), prices["USDT"]) - - // use one working provider and one provider with an incorrect exchange rate - ots.oracle.priceProviders = map[provider.Name]provider.Provider{ - provider.ProviderBinance: mockProvider{ - prices: map[string]types.TickerPrice{ - "JUNOUSDX": { - Price: sdk.MustNewDecFromStr("3.72"), - Volume: sdk.MustNewDecFromStr("2396974.02000000"), - }, - }, - }, - provider.ProviderKraken: mockProvider{ - prices: map[string]types.TickerPrice{ - "JUNOUSDC": { - Price: sdk.MustNewDecFromStr("3.70"), - Volume: sdk.MustNewDecFromStr("1994674.34000000"), - }, - }, - }, - provider.ProviderHuobi: mockProvider{ - prices: map[string]types.TickerPrice{ - "USDCUSD": { - Price: sdk.MustNewDecFromStr("1"), - Volume: sdk.MustNewDecFromStr("2396974.34000000"), - }, - }, - }, - provider.ProviderCoinbase: mockProvider{ - prices: map[string]types.TickerPrice{ - "USDTUSD": { - Price: sdk.MustNewDecFromStr("1"), - Volume: sdk.MustNewDecFromStr("1994674.34000000"), - }, - }, - }, - provider.ProviderOsmosis: mockProvider{ - prices: map[string]types.TickerPrice{ - "XBTUSDT": { - Price: sdk.MustNewDecFromStr("3.717"), - Volume: sdk.MustNewDecFromStr("1994674.34000000"), - }, - }, - }, - } - - ots.Require().NoError(ots.oracle.SetPrices(context.TODO())) - prices = ots.oracle.GetPrices() - ots.Require().Len(prices, 4) - ots.Require().Equal(sdk.MustNewDecFromStr("3.70"), prices["JUNO"]) - ots.Require().Equal(sdk.MustNewDecFromStr("3.717"), prices["XBT"]) - ots.Require().Equal(sdk.MustNewDecFromStr("1"), prices["USDC"]) - ots.Require().Equal(sdk.MustNewDecFromStr("1"), prices["USDT"]) - - // use one working provider and one provider that fails - ots.oracle.priceProviders = map[provider.Name]provider.Provider{ - provider.ProviderBinance: failingProvider{ - prices: map[string]types.TickerPrice{ - "JUNOUSDC": { - Price: sdk.MustNewDecFromStr("3.72"), - Volume: sdk.MustNewDecFromStr("2396974.02000000"), - }, - }, - }, - provider.ProviderKraken: mockProvider{ - prices: map[string]types.TickerPrice{ - "JUNOUSDC": { - Price: sdk.MustNewDecFromStr("3.71"), - Volume: sdk.MustNewDecFromStr("1994674.34000000"), - }, - }, - }, - provider.ProviderHuobi: mockProvider{ - prices: map[string]types.TickerPrice{ - "USDCUSD": { - Price: sdk.MustNewDecFromStr("1"), - Volume: sdk.MustNewDecFromStr("2396974.34000000"), - }, - }, - }, - provider.ProviderCoinbase: mockProvider{ - prices: map[string]types.TickerPrice{ - "USDTUSD": { - Price: sdk.MustNewDecFromStr("1"), - Volume: sdk.MustNewDecFromStr("1994674.34000000"), - }, - }, - }, - provider.ProviderOsmosis: mockProvider{ - prices: map[string]types.TickerPrice{ - "XBTUSDT": { - Price: sdk.MustNewDecFromStr("3.717"), - Volume: sdk.MustNewDecFromStr("1994674.34000000"), - }, - }, - }, - } - - ots.Require().NoError(ots.oracle.SetPrices(context.TODO())) - prices = ots.oracle.GetPrices() - ots.Require().Len(prices, 4) - ots.Require().Equal(sdk.MustNewDecFromStr("3.71"), prices["JUNO"]) - ots.Require().Equal(sdk.MustNewDecFromStr("3.717"), prices["XBT"]) - ots.Require().Equal(sdk.MustNewDecFromStr("1"), prices["USDC"]) - ots.Require().Equal(sdk.MustNewDecFromStr("1"), prices["USDT"]) -} - -func TestGenerateSalt(t *testing.T) { - salt, err := GenerateSalt(0) - require.Error(t, err) - require.Empty(t, salt) - - salt, err = GenerateSalt(32) - require.NoError(t, err) - require.NotEmpty(t, salt) -} - -func TestGenerateExchangeRatesString(t *testing.T) { - testCases := map[string]struct { - input map[string]sdk.Dec - expected string - }{ - "empty input": { - input: make(map[string]sdk.Dec), - expected: "", - }, - "single denom": { - input: map[string]sdk.Dec{ - "JUNO": sdk.MustNewDecFromStr("3.72"), - }, - expected: "JUNO:3.720000000000000000", - }, - "multi denom": { - input: map[string]sdk.Dec{ - "JUNO": sdk.MustNewDecFromStr("3.72"), - "ATOM": sdk.MustNewDecFromStr("40.13"), - "OSMO": sdk.MustNewDecFromStr("8.69"), - }, - expected: "ATOM:40.130000000000000000,JUNO:3.720000000000000000,OSMO:8.690000000000000000", - }, - } - - for name, tc := range testCases { - tc := tc - - t.Run(name, func(t *testing.T) { - out := GenerateExchangeRatesString(tc.input) - require.Equal(t, tc.expected, out) - }) - } -} - -func TestSuccessSetProviderTickerPricesAndCandles(t *testing.T) { - providerPrices := make(provider.AggregatedProviderPrices, 1) - providerCandles := make(provider.AggregatedProviderCandles, 1) - pair := types.CurrencyPair{ - Base: "ATOM", - Quote: "USDT", - } - - atomPrice := sdk.MustNewDecFromStr("29.93") - atomVolume := sdk.MustNewDecFromStr("894123.00") - - prices := make(map[string]types.TickerPrice, 1) - prices[pair.String()] = types.TickerPrice{ - Price: atomPrice, - Volume: atomVolume, - } - - candles := make(map[string][]types.CandlePrice, 1) - candles[pair.String()] = []types.CandlePrice{ - { - Price: atomPrice, - Volume: atomVolume, - TimeStamp: provider.PastUnixTime(1 * time.Minute), - }, - } - - success := SetProviderTickerPricesAndCandles( - provider.ProviderGate, - providerPrices, - providerCandles, - prices, - candles, - pair, - ) - - require.True(t, success, "It should successfully set the prices") - require.Equal(t, atomPrice, providerPrices[provider.ProviderGate][pair.Base].Price) - require.Equal(t, atomPrice, providerCandles[provider.ProviderGate][pair.Base][0].Price) -} - -func TestFailedSetProviderTickerPricesAndCandles(t *testing.T) { - success := SetProviderTickerPricesAndCandles( - provider.ProviderCoinbase, - make(provider.AggregatedProviderPrices, 1), - make(provider.AggregatedProviderCandles, 1), - make(map[string]types.TickerPrice, 1), - make(map[string][]types.CandlePrice, 1), - types.CurrencyPair{ - Base: "ATOM", - Quote: "USDT", - }, - ) - - require.False(t, success, "It should failed to set the prices, prices and candle are empty") -} - -func (ots *OracleTestSuite) TestSuccessGetComputedPricesCandles() { - providerCandles := make(provider.AggregatedProviderCandles, 1) - pair := types.CurrencyPair{ - Base: "ATOM", - Quote: "USD", - } - - atomPrice := sdk.MustNewDecFromStr("29.93") - atomVolume := sdk.MustNewDecFromStr("894123.00") - - candles := make(map[string][]types.CandlePrice, 1) - candles[pair.Base] = []types.CandlePrice{ - { - Price: atomPrice, - Volume: atomVolume, - TimeStamp: provider.PastUnixTime(1 * time.Minute), - }, - } - providerCandles[provider.ProviderBinance] = candles - - providerPair := map[provider.Name][]types.CurrencyPair{ - provider.ProviderBinance: {pair}, - } - - prices, err := ots.oracle.GetComputedPrices( - providerCandles, - make(provider.AggregatedProviderPrices, 1), - providerPair, - make(map[string]sdk.Dec), - ) - - require.NoError(ots.T(), err, "It should successfully get computed candle prices") - require.Equal(ots.T(), prices[pair.Base], atomPrice) -} - -func (ots *OracleTestSuite) TestSuccessGetComputedPricesTickers() { - providerPrices := make(provider.AggregatedProviderPrices, 1) - pair := types.CurrencyPair{ - Base: "ATOM", - Quote: "USD", - } - - atomPrice := sdk.MustNewDecFromStr("29.93") - atomVolume := sdk.MustNewDecFromStr("894123.00") - - tickerPrices := make(map[string]types.TickerPrice, 1) - tickerPrices[pair.Base] = types.TickerPrice{ - Price: atomPrice, - Volume: atomVolume, - } - providerPrices[provider.ProviderBinance] = tickerPrices - - providerPair := map[provider.Name][]types.CurrencyPair{ - provider.ProviderBinance: {pair}, - } - - prices, err := ots.oracle.GetComputedPrices( - make(provider.AggregatedProviderCandles, 1), - providerPrices, - providerPair, - make(map[string]sdk.Dec), - ) - - require.NoError(ots.T(), err, "It should successfully get computed ticker prices") - require.Equal(ots.T(), prices[pair.Base], atomPrice) -} - -func (ots *OracleTestSuite) TestGetComputedPricesCandlesConversion() { - btcPair := types.CurrencyPair{ - Base: "BTC", - Quote: "ETH", - } - btcUSDPair := types.CurrencyPair{ - Base: "BTC", - Quote: "USD", - } - ethPair := types.CurrencyPair{ - Base: "ETH", - Quote: "USD", - } - btcEthPrice := sdk.MustNewDecFromStr("17.55") - btcUSDPrice := sdk.MustNewDecFromStr("20962.601") - ethUsdPrice := sdk.MustNewDecFromStr("1195.02") - volume := sdk.MustNewDecFromStr("894123.00") - providerCandles := make(provider.AggregatedProviderCandles, 4) - - // normal rates - binanceCandles := make(map[string][]types.CandlePrice, 2) - binanceCandles[btcPair.Base] = []types.CandlePrice{ - { - Price: btcEthPrice, - Volume: volume, - TimeStamp: provider.PastUnixTime(1 * time.Minute), - }, - } - binanceCandles[ethPair.Base] = []types.CandlePrice{ - { - Price: ethUsdPrice, - Volume: volume, - TimeStamp: provider.PastUnixTime(1 * time.Minute), - }, - } - providerCandles[provider.ProviderBinance] = binanceCandles - - // normal rates - gateCandles := make(map[string][]types.CandlePrice, 1) - gateCandles[ethPair.Base] = []types.CandlePrice{ - { - Price: ethUsdPrice, - Volume: volume, - TimeStamp: provider.PastUnixTime(1 * time.Minute), - }, - } - gateCandles[btcPair.Base] = []types.CandlePrice{ - { - Price: btcEthPrice, - Volume: volume, - TimeStamp: provider.PastUnixTime(1 * time.Minute), - }, - } - providerCandles[provider.ProviderGate] = gateCandles - - // abnormal eth rate - okxCandles := make(map[string][]types.CandlePrice, 1) - okxCandles[ethPair.Base] = []types.CandlePrice{ - { - Price: sdk.MustNewDecFromStr("1.0"), - Volume: volume, - TimeStamp: provider.PastUnixTime(1 * time.Minute), - }, - } - providerCandles[provider.ProviderOkx] = okxCandles - - // btc / usd rate - krakenCandles := make(map[string][]types.CandlePrice, 1) - krakenCandles[btcUSDPair.Base] = []types.CandlePrice{ - { - Price: btcUSDPrice, - Volume: volume, - TimeStamp: provider.PastUnixTime(1 * time.Minute), - }, - } - providerCandles[provider.ProviderKraken] = krakenCandles - - providerPair := map[provider.Name][]types.CurrencyPair{ - provider.ProviderBinance: {btcPair, ethPair}, - provider.ProviderGate: {ethPair}, - provider.ProviderOkx: {ethPair}, - provider.ProviderKraken: {btcUSDPair}, - } - - prices, err := ots.oracle.GetComputedPrices( - providerCandles, - make(provider.AggregatedProviderPrices, 1), - providerPair, - make(map[string]sdk.Dec), - ) - - require.NoError(ots.T(), err, - "It should successfully filter out bad candles and convert everything to USD", - ) - require.Equal(ots.T(), - ethUsdPrice.Mul( - btcEthPrice).Add(btcUSDPrice).Quo(sdk.MustNewDecFromStr("2")), - prices[btcPair.Base], - ) -} - -func (ots *OracleTestSuite) TestGetComputedPricesTickersConversion() { - btcPair := types.CurrencyPair{ - Base: "BTC", - Quote: "ETH", - } - btcUSDPair := types.CurrencyPair{ - Base: "BTC", - Quote: "USD", - } - ethPair := types.CurrencyPair{ - Base: "ETH", - Quote: "USD", - } - volume := sdk.MustNewDecFromStr("881272.00") - btcEthPrice := sdk.MustNewDecFromStr("72.55") - ethUsdPrice := sdk.MustNewDecFromStr("9989.02") - btcUSDPrice := sdk.MustNewDecFromStr("724603.401") - providerPrices := make(provider.AggregatedProviderPrices, 1) - - // normal rates - binanceTickerPrices := make(map[string]types.TickerPrice, 2) - binanceTickerPrices[btcPair.Base] = types.TickerPrice{ - Price: btcEthPrice, - Volume: volume, - } - binanceTickerPrices[ethPair.Base] = types.TickerPrice{ - Price: ethUsdPrice, - Volume: volume, - } - providerPrices[provider.ProviderBinance] = binanceTickerPrices - - // normal rates - gateTickerPrices := make(map[string]types.TickerPrice, 4) - gateTickerPrices[btcPair.Base] = types.TickerPrice{ - Price: btcEthPrice, - Volume: volume, - } - gateTickerPrices[ethPair.Base] = types.TickerPrice{ - Price: ethUsdPrice, - Volume: volume, - } - providerPrices[provider.ProviderGate] = gateTickerPrices - - // abnormal eth rate - okxTickerPrices := make(map[string]types.TickerPrice, 1) - okxTickerPrices[ethPair.Base] = types.TickerPrice{ - Price: sdk.MustNewDecFromStr("1.0"), - Volume: volume, - } - providerPrices[provider.ProviderOkx] = okxTickerPrices - - // btc / usd rate - krakenTickerPrices := make(map[string]types.TickerPrice, 1) - krakenTickerPrices[btcUSDPair.Base] = types.TickerPrice{ - Price: btcUSDPrice, - Volume: volume, - } - providerPrices[provider.ProviderKraken] = krakenTickerPrices - - providerPair := map[provider.Name][]types.CurrencyPair{ - provider.ProviderBinance: {ethPair, btcPair}, - provider.ProviderGate: {ethPair}, - provider.ProviderOkx: {ethPair}, - provider.ProviderKraken: {btcUSDPair}, - } - - prices, err := ots.oracle.GetComputedPrices( - make(provider.AggregatedProviderCandles, 1), - providerPrices, - providerPair, - make(map[string]sdk.Dec), - ) - - require.NoError(ots.T(), err, - "It should successfully filter out bad tickers and convert everything to USD", - ) - require.Equal(ots.T(), - ethUsdPrice.Mul( - btcEthPrice).Add(btcUSDPrice).Quo(sdk.MustNewDecFromStr("2")), - prices[btcPair.Base], - ) -} - -func (ots *OracleTestSuite) TestGetComputedPricesEmptyTvwap() { - symbolUSDT := "USDT" - symbolUSD := "USD" - symbolDAI := "DAI" - symbolETH := "ETH" - - pairETHtoUSDT := types.CurrencyPair{ - Base: symbolETH, - Quote: symbolUSDT, - } - pairETHtoDAI := types.CurrencyPair{ - Base: symbolETH, - Quote: symbolDAI, - } - pairETHtoUSD := types.CurrencyPair{ - Base: symbolETH, - Quote: symbolUSD, - } - basePairsETH := []types.CurrencyPair{ - pairETHtoUSDT, - pairETHtoDAI, - } - krakenPairsETH := append(basePairsETH, pairETHtoUSD) //nolint:gocritic - - pairUSDTtoUSD := types.CurrencyPair{ - Base: symbolUSDT, - Quote: symbolUSD, - } - pairDAItoUSD := types.CurrencyPair{ - Base: symbolDAI, - Quote: symbolUSD, - } - stablecoinPairs := []types.CurrencyPair{ - pairUSDTtoUSD, - pairDAItoUSD, - } - - krakenPairs := append(krakenPairsETH, stablecoinPairs...) //nolint:gocritic - - volume := sdk.MustNewDecFromStr("881272.00") - ethUsdPrice := sdk.MustNewDecFromStr("9989.02") - daiUsdPrice := sdk.MustNewDecFromStr("999890000000000000") - ethTime := provider.PastUnixTime(1 * time.Minute) - - ethCandle := []types.CandlePrice{ - { - Price: ethUsdPrice, - Volume: volume, - TimeStamp: ethTime, - }, - { - Price: ethUsdPrice, - Volume: volume, - TimeStamp: ethTime, - }, - } - daiCandle := []types.CandlePrice{ - { - Price: daiUsdPrice, - Volume: volume, - TimeStamp: 1660829520000, - }, - } - - prices := provider.AggregatedProviderPrices{} - - pairs := map[provider.Name][]types.CurrencyPair{ - provider.ProviderKraken: krakenPairs, - } - - testCases := map[string]struct { - expected string - candles provider.AggregatedProviderCandles - prices provider.AggregatedProviderPrices - pairs map[provider.Name][]types.CurrencyPair - }{ - "Empty tvwap": { - candles: provider.AggregatedProviderCandles{ - provider.ProviderKraken: { - "USDT": ethCandle, - "ETH": ethCandle, - "DAI": daiCandle, - }, - }, - prices: prices, - pairs: pairs, - expected: "error on computing tvwap for quote: DAI, base: ETH", - }, - "No valid conversion rates DAI": { - candles: provider.AggregatedProviderCandles{ - provider.ProviderKraken: { - "USDT": ethCandle, - "ETH": ethCandle, - }, - }, - prices: prices, - pairs: pairs, - expected: "there are no valid conversion rates for DAI", - }, - } - - for name, tc := range testCases { - tc := tc - - ots.Run(name, func() { - _, err := ots.oracle.GetComputedPrices( - tc.candles, - tc.prices, - tc.pairs, - make(map[string]sdk.Dec), - ) - - require.ErrorContains(ots.T(), err, tc.expected) - }) - } -} diff --git a/price-feeder/oracle/param.go b/price-feeder/oracle/param.go deleted file mode 100644 index c8555cff5..000000000 --- a/price-feeder/oracle/param.go +++ /dev/null @@ -1,45 +0,0 @@ -package oracle - -import oracletypes "github.com/CosmosContracts/juno/v13/x/oracle/types" - -const ( - // paramsCacheInterval represents the amount of blocks - // during which we will cache the oracle params. - paramsCacheInterval = int64(200) -) - -// ParamCache is used to cache oracle param data for -// an amount of blocks, defined by paramsCacheInterval. -type ParamCache struct { - params *oracletypes.Params - lastUpdatedBlock int64 -} - -// Update retrieves the most recent oracle params and -// updates the instance. -func (paramCache *ParamCache) Update(currentBlockHeigh int64, params oracletypes.Params) { - paramCache.lastUpdatedBlock = currentBlockHeigh - paramCache.params = ¶ms -} - -// IsOutdated checks whether or not the current -// param data was fetched in the last 200 blocks. -func (paramCache *ParamCache) IsOutdated(currentBlockHeigh int64) bool { - if paramCache.params == nil { - return true - } - - if currentBlockHeigh < paramsCacheInterval { - return false - } - - // This is an edge case, which should never happen. - // The current blockchain height is lower - // than the last updated block, to fix we should - // just update the cached params again. - if currentBlockHeigh < paramCache.lastUpdatedBlock { - return true - } - - return (currentBlockHeigh - paramCache.lastUpdatedBlock) > paramsCacheInterval -} diff --git a/price-feeder/oracle/param_test.go b/price-feeder/oracle/param_test.go deleted file mode 100644 index c5cc3d925..000000000 --- a/price-feeder/oracle/param_test.go +++ /dev/null @@ -1,65 +0,0 @@ -package oracle - -import ( - "testing" - - oracletypes "github.com/CosmosContracts/juno/v13/x/oracle/types" - "github.com/stretchr/testify/require" -) - -func TestParamCacheIsOutdated(t *testing.T) { - testCases := map[string]struct { - paramCache ParamCache - currentBlockHeigh int64 - expected bool - }{ - "Params Nil": { - paramCache: ParamCache{ - params: nil, - lastUpdatedBlock: 0, - }, - currentBlockHeigh: 10, - expected: true, - }, - "currentBlockHeigh < cacheOnChainBlockQuantity": { - paramCache: ParamCache{ - params: &oracletypes.Params{}, - lastUpdatedBlock: 0, - }, - currentBlockHeigh: 199, - expected: false, - }, - "currentBlockHeigh < lastUpdatedBlock": { - paramCache: ParamCache{ - params: &oracletypes.Params{}, - lastUpdatedBlock: 205, - }, - currentBlockHeigh: 203, - expected: true, - }, - "Outdated": { - paramCache: ParamCache{ - params: &oracletypes.Params{}, - lastUpdatedBlock: 200, - }, - currentBlockHeigh: 401, - expected: true, - }, - "Limit to keep in cache": { - paramCache: ParamCache{ - params: &oracletypes.Params{}, - lastUpdatedBlock: 200, - }, - currentBlockHeigh: 400, - expected: false, - }, - } - - for name, tc := range testCases { - tc := tc - - t.Run(name, func(t *testing.T) { - require.Equal(t, tc.expected, tc.paramCache.IsOutdated(tc.currentBlockHeigh)) - }) - } -} diff --git a/price-feeder/oracle/prices.go b/price-feeder/oracle/prices.go deleted file mode 100644 index b4213c802..000000000 --- a/price-feeder/oracle/prices.go +++ /dev/null @@ -1,47 +0,0 @@ -package oracle - -import ( - "sync" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/CosmosContracts/juno/price-feeder/oracle/provider" -) - -type ( - PricesByProvider map[provider.Name]map[string]sdk.Dec - - PricesWithMutex struct { - prices PricesByProvider - mx sync.RWMutex - } -) - -// SetPrices sets the PricesWithMutex.prices value surrounded by a write lock -func (pwm *PricesWithMutex) SetPrices(prices PricesByProvider) { - pwm.mx.Lock() - defer pwm.mx.Unlock() - - pwm.prices = prices -} - -// GetPricesClone retrieves a clone of PricesWithMutex.prices -// surrounded by a read lock -func (pwm *PricesWithMutex) GetPricesClone() PricesByProvider { - pwm.mx.RLock() - defer pwm.mx.RUnlock() - return pwm.clonePrices() -} - -// clonePrices returns a deep copy of PricesWithMutex.prices -func (pwm *PricesWithMutex) clonePrices() PricesByProvider { - clone := make(PricesByProvider, len(pwm.prices)) - for provider, prices := range pwm.prices { - pricesClone := make(map[string]sdk.Dec, len(prices)) - for denom, price := range prices { - pricesClone[denom] = price - } - clone[provider] = pricesClone - } - return clone -} diff --git a/price-feeder/oracle/provider/binance.go b/price-feeder/oracle/provider/binance.go deleted file mode 100644 index f394b021f..000000000 --- a/price-feeder/oracle/provider/binance.go +++ /dev/null @@ -1,428 +0,0 @@ -package provider - -import ( - "context" - "encoding/json" - "fmt" - "net/http" - "net/url" - "strings" - "sync" - "time" - - "github.com/CosmosContracts/juno/price-feeder/oracle/types" - "github.com/gorilla/websocket" - "github.com/rs/zerolog" -) - -const ( - binanceWSHost = "fstream.binance.com:443" - binanceWSPath = "/ws/umeestream" - binanceRestHost = "https://api1.binance.com" - binanceRestPath = "/api/v3/ticker/price" -) - -var _ Provider = (*BinanceProvider)(nil) - -type ( - // BinanceProvider defines an Oracle provider implemented by the Binance public - // API. - // - // REF: https://binance-docs.github.io/apidocs/spot/en/#individual-symbol-mini-ticker-stream - // REF: https://binance-docs.github.io/apidocs/spot/en/#kline-candlestick-streams - BinanceProvider struct { - wsURL url.URL - wsClient *websocket.Conn - logger zerolog.Logger - mtx sync.RWMutex - endpoints Endpoint - tickers map[string]BinanceTicker // Symbol => BinanceTicker - candles map[string][]BinanceCandle // Symbol => BinanceCandle - subscribedPairs map[string]types.CurrencyPair // Symbol => types.CurrencyPair - } - - // BinanceTicker ticker price response. https://pkg.go.dev/encoding/json#Unmarshal - // Unmarshal matches incoming object keys to the keys used by Marshal (either the - // struct field name or its tag), preferring an exact match but also accepting a - // case-insensitive match. C field which is Statistics close time is not used, but - // it avoids to implement specific UnmarshalJSON. - BinanceTicker struct { - Symbol string `json:"s"` // Symbol ex.: BTCUSDT - LastPrice string `json:"c"` // Last price ex.: 0.0025 - Volume string `json:"v"` // Total traded base asset volume ex.: 1000 - C uint64 `json:"C"` // Statistics close time - } - - // BinanceCandleMetadata candle metadata used to compute tvwap price. - BinanceCandleMetadata struct { - Close string `json:"c"` // Price at close - TimeStamp int64 `json:"T"` // Close time in unix epoch ex.: 1645756200000 - Volume string `json:"v"` // Volume during period - } - - // BinanceCandle candle binance websocket channel "kline_1m" response. - BinanceCandle struct { - Symbol string `json:"s"` // Symbol ex.: BTCUSDT - Metadata BinanceCandleMetadata `json:"k"` // Metadata for candle - } - - // BinanceSubscribeMsg Msg to subscribe all the tickers channels. - BinanceSubscriptionMsg struct { - Method string `json:"method"` // SUBSCRIBE/UNSUBSCRIBE - Params []string `json:"params"` // streams to subscribe ex.: usdtatom@ticker - ID uint16 `json:"id"` // identify messages going back and forth - } - - // BinancePairSummary defines the response structure for a Binance pair - // summary. - BinancePairSummary struct { - Symbol string `json:"symbol"` - } -) - -func NewBinanceProvider( - ctx context.Context, - logger zerolog.Logger, - endpoints Endpoint, - pairs ...types.CurrencyPair, -) (*BinanceProvider, error) { - if (endpoints.Name) != ProviderBinance { - endpoints = Endpoint{ - Name: ProviderBinance, - Rest: binanceRestHost, - Websocket: binanceWSHost, - } - } - - wsURL := url.URL{ - Scheme: "wss", - Host: endpoints.Websocket, - Path: binanceWSPath, - } - - wsConn, resp, err := websocket.DefaultDialer.Dial(wsURL.String(), nil) - defer resp.Body.Close() - if err != nil { - return nil, fmt.Errorf( - types.ErrWebsocketDial.Error(), - ProviderBinance, - err, - ) - } - - provider := &BinanceProvider{ - wsURL: wsURL, - wsClient: wsConn, - logger: logger.With().Str("provider", string(ProviderBinance)).Logger(), - endpoints: endpoints, - tickers: map[string]BinanceTicker{}, - candles: map[string][]BinanceCandle{}, - subscribedPairs: map[string]types.CurrencyPair{}, - } - - if err := provider.SubscribeCurrencyPairs(pairs...); err != nil { - return nil, err - } - - go provider.handleWebSocketMsgs(ctx) - - return provider, nil -} - -// GetTickerPrices returns the tickerPrices based on the provided pairs. -func (p *BinanceProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[string]types.TickerPrice, error) { - tickerPrices := make(map[string]types.TickerPrice, len(pairs)) - - for _, cp := range pairs { - key := cp.String() - price, err := p.getTickerPrice(key) - if err != nil { - return nil, err - } - tickerPrices[key] = price - } - - return tickerPrices, nil -} - -// GetCandlePrices returns the candlePrices based on the provided pairs. -func (p *BinanceProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[string][]types.CandlePrice, error) { - candlePrices := make(map[string][]types.CandlePrice, len(pairs)) - - for _, cp := range pairs { - key := cp.String() - prices, err := p.getCandlePrices(key) - if err != nil { - return nil, err - } - candlePrices[key] = prices - } - - return candlePrices, nil -} - -// SubscribeCurrencyPairs subscribe all currency pairs into ticker and candle channels. -func (p *BinanceProvider) SubscribeCurrencyPairs(cps ...types.CurrencyPair) error { - if len(cps) == 0 { - return fmt.Errorf("currency pairs is empty") - } - - if err := p.subscribeChannels(cps...); err != nil { - return err - } - - p.setSubscribedPairs(cps...) - telemetryWebsocketSubscribeCurrencyPairs(ProviderBinance, len(cps)) - return nil -} - -// subscribeChannels subscribe to the ticker and candle channels for all currency pairs. -func (p *BinanceProvider) subscribeChannels(cps ...types.CurrencyPair) error { - if err := p.subscribeTickers(cps...); err != nil { - return err - } - - return p.subscribeCandles(cps...) -} - -// subscribeTickers subscribe to the ticker channel for all currency pairs. -func (p *BinanceProvider) subscribeTickers(cps ...types.CurrencyPair) error { - pairs := make([]string, len(cps)) - - for i, cp := range cps { - pairs[i] = currencyPairToBinanceTickerPair(cp) - } - - return p.subscribePairs(pairs...) -} - -// subscribeCandles subscribe to the candle channel for all currency pairs. -func (p *BinanceProvider) subscribeCandles(cps ...types.CurrencyPair) error { - pairs := make([]string, len(cps)) - - for i, cp := range cps { - pairs[i] = currencyPairToBinanceCandlePair(cp) - } - - return p.subscribePairs(pairs...) -} - -// subscribedPairsToSlice returns the map of subscribed pairs as a slice. -func (p *BinanceProvider) subscribedPairsToSlice() []types.CurrencyPair { - p.mtx.RLock() - defer p.mtx.RUnlock() - - return types.MapPairsToSlice(p.subscribedPairs) -} - -func (p *BinanceProvider) getTickerPrice(key string) (types.TickerPrice, error) { - p.mtx.RLock() - defer p.mtx.RUnlock() - - ticker, ok := p.tickers[key] - if !ok { - return types.TickerPrice{}, fmt.Errorf("binance failed to get ticker price for %s", key) - } - - return ticker.toTickerPrice() -} - -func (p *BinanceProvider) getCandlePrices(key string) ([]types.CandlePrice, error) { - p.mtx.RLock() - defer p.mtx.RUnlock() - - candles, ok := p.candles[key] - if !ok { - return []types.CandlePrice{}, fmt.Errorf("binance failed to get candle prices for %s", key) - } - - candleList := []types.CandlePrice{} - for _, candle := range candles { - cp, err := candle.toCandlePrice() - if err != nil { - return []types.CandlePrice{}, err - } - candleList = append(candleList, cp) - } - return candleList, nil -} - -func (p *BinanceProvider) messageReceived(messageType int, bz []byte) { - if messageType != websocket.TextMessage { - return - } - - var ( - tickerResp BinanceTicker - tickerErr error - candleResp BinanceCandle - candleErr error - ) - - tickerErr = json.Unmarshal(bz, &tickerResp) - if len(tickerResp.LastPrice) != 0 { - p.setTickerPair(tickerResp) - telemetryWebsocketMessage(ProviderBinance, MessageTypeTicker) - return - } - - candleErr = json.Unmarshal(bz, &candleResp) - if len(candleResp.Metadata.Close) != 0 { - p.setCandlePair(candleResp) - telemetryWebsocketMessage(ProviderBinance, MessageTypeCandle) - return - } - - p.logger.Error(). - Int("length", len(bz)). - AnErr("ticker", tickerErr). - AnErr("candle", candleErr). - Msg("Error on receive message") -} - -func (p *BinanceProvider) setTickerPair(ticker BinanceTicker) { - p.mtx.Lock() - defer p.mtx.Unlock() - p.tickers[ticker.Symbol] = ticker -} - -func (p *BinanceProvider) setCandlePair(candle BinanceCandle) { - p.mtx.Lock() - defer p.mtx.Unlock() - staleTime := PastUnixTime(providerCandlePeriod) - candleList := []BinanceCandle{} - candleList = append(candleList, candle) - - for _, c := range p.candles[candle.Symbol] { - if staleTime < c.Metadata.TimeStamp { - candleList = append(candleList, c) - } - } - p.candles[candle.Symbol] = candleList -} - -func (ticker BinanceTicker) toTickerPrice() (types.TickerPrice, error) { - return types.NewTickerPrice(string(ProviderBinance), ticker.Symbol, ticker.LastPrice, ticker.Volume) -} - -func (candle BinanceCandle) toCandlePrice() (types.CandlePrice, error) { - return types.NewCandlePrice(string(ProviderBinance), candle.Symbol, candle.Metadata.Close, candle.Metadata.Volume, - candle.Metadata.TimeStamp) -} - -func (p *BinanceProvider) handleWebSocketMsgs(ctx context.Context) { - reconnectTicker := time.NewTicker(defaultMaxConnectionTime) - defer reconnectTicker.Stop() - - for { - select { - case <-ctx.Done(): - return - case <-time.After(defaultReadNewWSMessage): - messageType, bz, err := p.wsClient.ReadMessage() - if err != nil { - // if some error occurs continue to try to read the next message. - p.logger.Err(err).Msg("could not read message") - continue - } - - if len(bz) == 0 { - continue - } - - p.messageReceived(messageType, bz) - - case <-reconnectTicker.C: - if err := p.reconnect(); err != nil { - p.logger.Err(err).Msg("error reconnecting") - } - } - } -} - -// reconnect closes the last WS connection then create a new one and subscribe to -// all subscribed pairs in the ticker and candle pais. A single connection to -// stream.binance.com is only valid for 24 hours; expect to be disconnected at the -// 24 hour mark. The websocket server will send a ping frame every 3 minutes. If -// the websocket server does not receive a pong frame back from the connection -// within a 10 minute period, the connection will be disconnected. -func (p *BinanceProvider) reconnect() error { - err := p.wsClient.Close() - if err != nil { - p.logger.Err(err).Msg("error closing binance websocket") - } - - p.logger.Debug().Msg("reconnecting websocket") - wsConn, resp, err := websocket.DefaultDialer.Dial(p.wsURL.String(), nil) - defer resp.Body.Close() - if err != nil { - return fmt.Errorf( - types.ErrWebsocketDial.Error(), - ProviderBinance, - err, - ) - } - p.wsClient = wsConn - telemetryWebsocketReconnect(ProviderBinance) - - return p.subscribeChannels(p.subscribedPairsToSlice()...) -} - -// setSubscribedPairs sets N currency pairs to the map of subscribed pairs. -func (p *BinanceProvider) setSubscribedPairs(cps ...types.CurrencyPair) { - p.mtx.Lock() - defer p.mtx.Unlock() - - for _, cp := range cps { - p.subscribedPairs[cp.String()] = cp - } -} - -// subscribePairs write the subscription msg to the provider. -func (p *BinanceProvider) subscribePairs(pairs ...string) error { - subsMsg := newBinanceSubscriptionMsg(pairs...) - return p.wsClient.WriteJSON(subsMsg) -} - -// GetAvailablePairs returns all pairs to which the provider can subscribe. -// ex.: map["ATOMUSDT" => {}, "UMEEUSDC" => {}]. -func (p *BinanceProvider) GetAvailablePairs() (map[string]struct{}, error) { - resp, err := http.Get(p.endpoints.Rest + binanceRestPath) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - var pairsSummary []BinancePairSummary - if err := json.NewDecoder(resp.Body).Decode(&pairsSummary); err != nil { - return nil, err - } - - availablePairs := make(map[string]struct{}, len(pairsSummary)) - for _, pairName := range pairsSummary { - availablePairs[strings.ToUpper(pairName.Symbol)] = struct{}{} - } - - return availablePairs, nil -} - -// currencyPairToBinanceTickerPair receives a currency pair and return binance -// ticker symbol atomusdt@ticker. -func currencyPairToBinanceTickerPair(cp types.CurrencyPair) string { - return strings.ToLower(cp.String() + "@ticker") -} - -// currencyPairToBinanceCandlePair receives a currency pair and return binance -// candle symbol atomusdt@kline_1m. -func currencyPairToBinanceCandlePair(cp types.CurrencyPair) string { - return strings.ToLower(cp.String() + "@kline_1m") -} - -// newBinanceSubscriptionMsg returns a new subscription Msg. -func newBinanceSubscriptionMsg(params ...string) BinanceSubscriptionMsg { - return BinanceSubscriptionMsg{ - Method: "SUBSCRIBE", - Params: params, - ID: 1, - } -} diff --git a/price-feeder/oracle/provider/binance_test.go b/price-feeder/oracle/provider/binance_test.go deleted file mode 100644 index c74676d31..000000000 --- a/price-feeder/oracle/provider/binance_test.go +++ /dev/null @@ -1,99 +0,0 @@ -package provider - -import ( - "context" - "testing" - - "github.com/CosmosContracts/juno/price-feeder/oracle/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/rs/zerolog" - "github.com/stretchr/testify/require" -) - -func TestBinanceProvider_GetTickerPrices(t *testing.T) { - p, err := NewBinanceProvider( - context.TODO(), - zerolog.Nop(), - Endpoint{}, - types.CurrencyPair{Base: "ATOM", Quote: "USDT"}, - ) - require.NoError(t, err) - - t.Run("valid_request_single_ticker", func(t *testing.T) { - lastPrice := "34.69000000" //nolint:goconst - volume := "2396974.02000000" //nolint:goconst - - tickerMap := map[string]BinanceTicker{} - tickerMap["ATOMUSDT"] = BinanceTicker{ - Symbol: "ATOMUSDT", - LastPrice: lastPrice, - Volume: volume, - } - - p.tickers = tickerMap - - prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "ATOM", Quote: "USDT"}) - require.NoError(t, err) - require.Len(t, prices, 1) - require.Equal(t, sdk.MustNewDecFromStr(lastPrice), prices["ATOMUSDT"].Price) - require.Equal(t, sdk.MustNewDecFromStr(volume), prices["ATOMUSDT"].Volume) - }) - - t.Run("valid_request_multi_ticker", func(t *testing.T) { - lastPriceAtom := "34.69000000" - lastPriceLuna := "41.35000000" //nolint:goconst - volume := "2396974.02000000" - - tickerMap := map[string]BinanceTicker{} - tickerMap["ATOMUSDT"] = BinanceTicker{ - Symbol: "ATOMUSDT", - LastPrice: lastPriceAtom, - Volume: volume, - } - - tickerMap["LUNAUSDT"] = BinanceTicker{ - Symbol: "LUNAUSDT", - LastPrice: lastPriceLuna, - Volume: volume, - } - - p.tickers = tickerMap - prices, err := p.GetTickerPrices( - types.CurrencyPair{Base: "ATOM", Quote: "USDT"}, - types.CurrencyPair{Base: "LUNA", Quote: "USDT"}, - ) - require.NoError(t, err) - require.Len(t, prices, 2) - require.Equal(t, sdk.MustNewDecFromStr(lastPriceAtom), prices["ATOMUSDT"].Price) - require.Equal(t, sdk.MustNewDecFromStr(volume), prices["ATOMUSDT"].Volume) - require.Equal(t, sdk.MustNewDecFromStr(lastPriceLuna), prices["LUNAUSDT"].Price) - require.Equal(t, sdk.MustNewDecFromStr(volume), prices["LUNAUSDT"].Volume) - }) - - t.Run("invalid_request_invalid_ticker", func(t *testing.T) { - prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "FOO", Quote: "BAR"}) - require.EqualError(t, err, "binance failed to get ticker price for FOOBAR") - require.Nil(t, prices) - }) -} - -func TestBinanceProvider_SubscribeCurrencyPairs(t *testing.T) { - p, err := NewBinanceProvider( - context.TODO(), - zerolog.Nop(), - Endpoint{}, - types.CurrencyPair{Base: "ATOM", Quote: "USDT"}, - ) - require.NoError(t, err) - - t.Run("invalid_subscribe_channels_empty", func(t *testing.T) { - err = p.SubscribeCurrencyPairs([]types.CurrencyPair{}...) - require.ErrorContains(t, err, "currency pairs is empty") - }) -} - -func TestBinanceCurrencyPairToBinancePair(t *testing.T) { - cp := types.CurrencyPair{Base: "ATOM", Quote: "USDT"} - binanceSymbol := currencyPairToBinanceTickerPair(cp) - require.Equal(t, binanceSymbol, "atomusdt@ticker") -} diff --git a/price-feeder/oracle/provider/bitget.go b/price-feeder/oracle/provider/bitget.go deleted file mode 100644 index 58c3ceb6c..000000000 --- a/price-feeder/oracle/provider/bitget.go +++ /dev/null @@ -1,542 +0,0 @@ -package provider - -import ( - "context" - "encoding/json" - "fmt" - "net/http" - "net/url" - "strconv" - "sync" - "time" - - "github.com/CosmosContracts/juno/price-feeder/oracle/types" - "github.com/gorilla/websocket" - "github.com/rs/zerolog" -) - -const ( - bitgetWSHost = "ws.bitget.com" - bitgetWSPath = "/spot/v1/stream" - bitgetReconnectTime = time.Minute * 2 - bitgetRestHost = "https://api.bitget.com" - bitgetRestPath = "/api/spot/v1/public/products" - tickerChannel = "ticker" - candleChannel = "candle5m" - instType = "SP" -) - -var _ Provider = (*BitgetProvider)(nil) - -type ( - // BitgetProvider defines an Oracle provider implemented by the Bitget public - // API. - // - // REF: https://bitgetlimited.github.io/apidoc/en/spot/#tickers-channel - // REF: https://bitgetlimited.github.io/apidoc/en/spot/#candlesticks-channel - BitgetProvider struct { - wsURL url.URL - wsClient *websocket.Conn - logger zerolog.Logger - mtx sync.RWMutex - endpoints Endpoint - tickers map[string]BitgetTicker // Symbol => BitgetTicker - candles map[string][]BitgetCandle // Symbol => BitgetCandle - subscribedPairs map[string]types.CurrencyPair // Symbol => types.CurrencyPair - } - - // BitgetSubscriptionMsg Msg to subscribe all at once. - BitgetSubscriptionMsg struct { - Operation string `json:"op"` // Operation (e.x. "subscribe") - Args []BitgetSubscriptionArg `json:"args"` // Arguments to subscribe to - } - BitgetSubscriptionArg struct { - InstType string `json:"instType"` // Instrument type (e.g. "sp") - Channel string `json:"channel"` // Channel (e.x. "ticker" / "candle5m") - InstID string `json:"instId"` // Instrument ID (e.x. BTCUSDT) - } - - // BitgetErrResponse is the structure for bitget subscription errors. - BitgetErrResponse struct { - Event string `json:"event"` // e.x. "error" - Code uint64 `json:"code"` // e.x. 30003 for invalid op - Msg string `json:"msg"` // e.x. "INVALID op" - } - // BitgetSubscriptionResponse is the structure for bitget subscription confirmations. - BitgetSubscriptionResponse struct { - Event string `json:"event"` // e.x. "subscribe" - Arg BitgetSubscriptionArg `json:"arg"` // subscription event argument - } - - // BitgetTickerResponse is the structure for bitget ticker messages. - BitgetTicker struct { - Action string `json:"action"` // e.x. "snapshot" - Arg BitgetSubscriptionArg `json:"arg"` // subscription event argument - Data []BitgetTickerData `json:"data"` // ticker data - } - BitgetTickerData struct { - InstID string `json:"instId"` // e.x. BTCUSD - Price string `json:"last"` // last price e.x. "12.3907" - Volume string `json:"baseVolume"` // volume in base asset (e.x. "112247.9173") - } - - // BitgetCandleResponse is the response structure for the bitget ticker message. - BitgetCandleResponse struct { - Action string `json:"action"` // e.x. "snapshot" - Arg BitgetSubscriptionArg `json:"arg"` // subscription event argument - Data [][]string `json:"data"` // candle data in an array at data[0]. - } - BitgetCandle struct { - Arg BitgetSubscriptionArg // subscription event argument - TimeStamp int64 // unix timestamp in milliseconds e.x. 1597026383085 - Close string // Most recent price e.x. "8533.02" - Volume string // volume e.x. "45247" - } - - // BitgetPairsSummary defines the response structure for a Bitget pairs - // summary. - BitgetPairsSummary struct { - RespCode string `json:"code"` - Data []BitgetPairData `json:"data"` - } - BitgetPairData struct { - Base string `json:"baseCoin"` - Quote string `json:"quoteCoin"` - } -) - -// NewBitgetProvider returns a new Bitget provider with the WS connection -// and msg handler. -func NewBitgetProvider( - ctx context.Context, - logger zerolog.Logger, - endpoints Endpoint, - pairs ...types.CurrencyPair, -) (*BitgetProvider, error) { - if endpoints.Name != ProviderBitget { - endpoints = Endpoint{ - Name: ProviderBitget, - Rest: bitgetRestHost, - Websocket: bitgetWSHost, - } - } - - wsURL := url.URL{ - Scheme: "wss", - Host: endpoints.Websocket, - Path: bitgetWSPath, - } - - wsConn, resp, err := websocket.DefaultDialer.Dial(wsURL.String(), nil) - if err != nil { - return nil, fmt.Errorf( - types.ErrWebsocketDial.Error(), - ProviderBitget, - err, - ) - } - defer resp.Body.Close() - - provider := &BitgetProvider{ - wsURL: wsURL, - wsClient: wsConn, - logger: logger.With().Str("provider", string(ProviderBitget)).Logger(), - endpoints: endpoints, - tickers: map[string]BitgetTicker{}, - candles: map[string][]BitgetCandle{}, - subscribedPairs: map[string]types.CurrencyPair{}, - } - - if err := provider.SubscribeCurrencyPairs(pairs...); err != nil { - return nil, err - } - - go provider.handleWebSocketMsgs(ctx) - - return provider, nil -} - -// GetTickerPrices returns the tickerPrices based on the saved map. -func (p *BitgetProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[string]types.TickerPrice, error) { - tickerPrices := make(map[string]types.TickerPrice, len(pairs)) - - for _, cp := range pairs { - price, err := p.getTickerPrice(cp) - if err != nil { - return nil, err - } - tickerPrices[cp.String()] = price - } - - return tickerPrices, nil -} - -// GetTickerPrices returns the tickerPrices based on the saved map. -func (p *BitgetProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[string][]types.CandlePrice, error) { - candlePrices := make(map[string][]types.CandlePrice, len(pairs)) - - for _, cp := range pairs { - price, err := p.getCandlePrices(cp) - if err != nil { - return nil, err - } - candlePrices[cp.String()] = price - } - - return candlePrices, nil -} - -// SubscribeCurrencyPairs subscribe all currency pairs into -// ticker and candle channels. -func (p *BitgetProvider) SubscribeCurrencyPairs(cps ...types.CurrencyPair) error { - if len(cps) == 0 { - return fmt.Errorf("currency pairs is empty") - } - - if err := p.subscribeChannels(cps...); err != nil { - return err - } - - p.setSubscribedPairs(cps...) - telemetryWebsocketSubscribeCurrencyPairs(ProviderBitget, len(cps)) - return nil -} - -// subscribeChannels subscribe all currency pairs into ticker and candle channels. -func (p *BitgetProvider) subscribeChannels(cps ...types.CurrencyPair) error { - bitgetSubscriptionMsg := newBitgetTickerSubscriptionMsg(cps) - return p.wsClient.WriteJSON(bitgetSubscriptionMsg) -} - -// subscribedPairsToSlice returns the map of subscribed pairs as slice -func (p *BitgetProvider) subscribedPairsToSlice() []types.CurrencyPair { - p.mtx.RLock() - defer p.mtx.RUnlock() - - return types.MapPairsToSlice(p.subscribedPairs) -} - -func (p *BitgetProvider) handleWebSocketMsgs(ctx context.Context) { - reconnectTicker := time.NewTicker(bitgetReconnectTime) - for { - select { - case <-ctx.Done(): - return - case <-time.After(defaultReadNewWSMessage): - messageType, bz, err := p.wsClient.ReadMessage() - if err != nil { - // If some error occurs, check if connection is alive - // and continue to try to read the next message. - p.logger.Err(err).Msg("failed to read message") - if err := p.ping(); err != nil { - p.logger.Err(err).Msg("failed to send ping") - if err := p.disconnect(); err != nil { - p.logger.Err(err).Msg("error disconnecting websocket") - } - if err := p.reconnect(); err != nil { - p.logger.Err(err).Msg("error reconnecting websocket") - } - } - continue - } - - if len(bz) == 0 { - continue - } - - p.messageReceived(messageType, bz, reconnectTicker) - - case <-reconnectTicker.C: - if err := p.disconnect(); err != nil { - p.logger.Err(err).Msg("error disconnecting websocket") - } - if err := p.reconnect(); err != nil { - p.logger.Err(err).Msg("error reconnecting websocket") - } - } - } -} - -// messageReceived handles the received data from the Bitget websocket. -func (p *BitgetProvider) messageReceived(messageType int, bz []byte, reconnectTicker *time.Ticker) { - if messageType != websocket.TextMessage { - return - } - - if messageType == websocket.PingMessage { - p.pong(bz, reconnectTicker) - return - } - - var ( - tickerResp BitgetTicker - tickerErr error - candleResp BitgetCandleResponse - candleErr error - errResponse BitgetErrResponse - subscriptionResponse BitgetSubscriptionResponse - ) - - err := json.Unmarshal(bz, &errResponse) - if err == nil && errResponse.Code != 0 { - p.logger.Error(). - Int("length", len(bz)). - Str("msg", errResponse.Msg). - Str("body", string(bz)). - Msg("Error on receive bitget message") - return - } - - err = json.Unmarshal(bz, &subscriptionResponse) - if err != nil && subscriptionResponse.Event == "subscribe" { - p.logger.Debug(). - Str("InstID", subscriptionResponse.Arg.InstID). - Str("Channel", subscriptionResponse.Arg.Channel). - Str("InstType", subscriptionResponse.Arg.InstType). - Msg("Bitget subscription confirmed") - return - } - - tickerErr = json.Unmarshal(bz, &tickerResp) - if tickerResp.Arg.Channel == tickerChannel { - p.setTickerPair(tickerResp) - telemetryWebsocketMessage(ProviderBitget, MessageTypeTicker) - return - } - - candleErr = json.Unmarshal(bz, &candleResp) - if candleResp.Arg.Channel == candleChannel { - candle, err := candleResp.ToBitgetCandle() - if err != nil { - p.logger.Error(). - Int("length", len(bz)). - AnErr("candle", err). - Msg("Unable to parse bitget candle") - } - p.setCandlePair(candle) - telemetryWebsocketMessage(ProviderBitget, MessageTypeCandle) - return - } - - p.logger.Error(). - Int("length", len(bz)). - AnErr("ticker", tickerErr). - AnErr("candle", candleErr). - Msg("Error on receive message") -} - -// ToBitgetCandle turns a BitgetCandleResponse into a more-readable -// BitgetCandle. The Close and Volume responses are at the [0][4] and -// [0][5] indexes respectively. -// Ref: https://bitgetlimited.github.io/apidoc/en/spot/#candlesticks-channel -func (bcr BitgetCandleResponse) ToBitgetCandle() (BitgetCandle, error) { - if len(bcr.Data) < 1 || len(bcr.Data[0]) < 6 { - return BitgetCandle{}, fmt.Errorf("invalid candle response") - } - - ts, err := strconv.ParseInt(bcr.Data[0][0], 10, 64) - if err != nil { - return BitgetCandle{}, err - } - - return BitgetCandle{ - Arg: bcr.Arg, - TimeStamp: ts, - Close: bcr.Data[0][4], - Volume: bcr.Data[0][5], - }, nil -} - -// pong return a heartbeat message when a "ping" is received and reset the -// recconnect ticker because the connection is alive. After connected to Bitget's -// Websocket server, the server will send heartbeat periodically (5s interval). -// When client receives an heartbeat message, it should respond with a matching -// "pong" message which has the same integer in it, e.g. {"ping": 1492420473027} -// and then the return pong message should be {"pong": 1492420473027}. -func (p *BitgetProvider) pong(bz []byte, reconnectTicker *time.Ticker) { - reconnectTicker.Reset(bitgetReconnectTime) - var heartbeat struct { - Ping uint64 `json:"ping"` - } - - if err := json.Unmarshal(bz, &heartbeat); err != nil { - p.logger.Err(err).Msg("could not unmarshal heartbeat") - return - } - - if err := p.wsClient.WriteJSON(struct { - Pong uint64 `json:"pong"` - }{Pong: heartbeat.Ping}); err != nil { - p.logger.Err(err).Msg("could not send pong message back") - } -} - -// ping to check websocket connection -func (p *BitgetProvider) ping() error { - return p.wsClient.WriteMessage(websocket.PingMessage, ping) -} - -func (p *BitgetProvider) setTickerPair(ticker BitgetTicker) { - p.mtx.Lock() - defer p.mtx.Unlock() - p.tickers[ticker.Arg.InstID] = ticker -} - -func (p *BitgetProvider) setCandlePair(candle BitgetCandle) { - p.mtx.Lock() - defer p.mtx.Unlock() - staleTime := PastUnixTime(providerCandlePeriod) - candleList := []BitgetCandle{} - candleList = append(candleList, candle) - - for _, c := range p.candles[candle.Arg.InstID] { - if staleTime < c.TimeStamp { - candleList = append(candleList, c) - } - } - p.candles[candle.Arg.InstID] = candleList -} - -// disconnect disconnects the existing websocket connection. -func (p *BitgetProvider) disconnect() error { - err := p.wsClient.Close() - if err != nil { - return types.ErrProviderConnection.Wrapf("error closing Bitget websocket %v", err) - } - return nil -} - -// reconnect creates a new websocket connection. -func (p *BitgetProvider) reconnect() error { - p.logger.Debug().Msg("reconnecting websocket") - wsConn, resp, err := websocket.DefaultDialer.Dial(p.wsURL.String(), nil) - defer resp.Body.Close() - if err != nil { - return fmt.Errorf( - types.ErrWebsocketDial.Error(), - ProviderBitget, - err, - ) - } - p.wsClient = wsConn - - currencyPairs := p.subscribedPairsToSlice() - - telemetryWebsocketReconnect(ProviderBitget) - return p.subscribeChannels(currencyPairs...) -} - -func (p *BitgetProvider) getTickerPrice(cp types.CurrencyPair) (types.TickerPrice, error) { - p.mtx.RLock() - defer p.mtx.RUnlock() - - ticker, ok := p.tickers[cp.String()] - if !ok { - return types.TickerPrice{}, fmt.Errorf("bitget failed to get ticker price for %s", cp.String()) - } - - return ticker.toTickerPrice() -} - -func (p *BitgetProvider) getCandlePrices(cp types.CurrencyPair) ([]types.CandlePrice, error) { - p.mtx.RLock() - defer p.mtx.RUnlock() - - candles, ok := p.candles[cp.String()] - if !ok { - return []types.CandlePrice{}, fmt.Errorf("failed to get candles price for %s", cp.String()) - } - - candleList := []types.CandlePrice{} - for _, candle := range candles { - cp, err := candle.toCandlePrice() - if err != nil { - return []types.CandlePrice{}, err - } - candleList = append(candleList, cp) - } - return candleList, nil -} - -// setSubscribedPairs sets N currency pairs to the map of subscribed pairs. -func (p *BitgetProvider) setSubscribedPairs(cps ...types.CurrencyPair) { - p.mtx.Lock() - defer p.mtx.Unlock() - - for _, cp := range cps { - p.subscribedPairs[cp.String()] = cp - } -} - -// GetAvailablePairs returns all pairs to which the provider can subscribe. -func (p *BitgetProvider) GetAvailablePairs() (map[string]struct{}, error) { - resp, err := http.Get(p.endpoints.Rest + bitgetRestPath) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - var pairsSummary BitgetPairsSummary - if err := json.NewDecoder(resp.Body).Decode(&pairsSummary); err != nil { - return nil, err - } - if pairsSummary.RespCode != "00000" { - return nil, fmt.Errorf("unable to get bitget available pairs") - } - - availablePairs := make(map[string]struct{}, len(pairsSummary.Data)) - for _, pair := range pairsSummary.Data { - cp := types.CurrencyPair{ - Base: pair.Base, - Quote: pair.Quote, - } - availablePairs[cp.String()] = struct{}{} - } - - return availablePairs, nil -} - -// toTickerPrice converts current BitgetTicker to TickerPrice. -func (ticker BitgetTicker) toTickerPrice() (types.TickerPrice, error) { - if len(ticker.Data) < 1 { - return types.TickerPrice{}, fmt.Errorf("ticker has no data") - } - return types.NewTickerPrice( - string(ProviderBitget), - ticker.Arg.InstID, - ticker.Data[0].Price, - ticker.Data[0].Volume, - ) -} - -func (candle BitgetCandle) toCandlePrice() (types.CandlePrice, error) { - return types.NewCandlePrice( - string(ProviderBitget), - candle.Arg.InstID, - candle.Close, - candle.Volume, - candle.TimeStamp, - ) -} - -// newBitgetTickerSubscriptionMsg returns a new ticker subscription Msg. -func newBitgetTickerSubscriptionMsg(cps []types.CurrencyPair) BitgetSubscriptionMsg { - args := []BitgetSubscriptionArg{} - for _, cp := range cps { - args = append(args, BitgetSubscriptionArg{ - InstType: instType, - Channel: tickerChannel, - InstID: cp.String(), - }) - args = append(args, BitgetSubscriptionArg{ - InstType: instType, - Channel: candleChannel, - InstID: cp.String(), - }) - } - - return BitgetSubscriptionMsg{ - Operation: "subscribe", - Args: args, - } -} diff --git a/price-feeder/oracle/provider/bitget_test.go b/price-feeder/oracle/provider/bitget_test.go deleted file mode 100644 index 99ce895c8..000000000 --- a/price-feeder/oracle/provider/bitget_test.go +++ /dev/null @@ -1,197 +0,0 @@ -package provider - -import ( - "context" - "testing" - - "github.com/CosmosContracts/juno/price-feeder/oracle/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/rs/zerolog" - "github.com/stretchr/testify/require" -) - -func TestBitgetProvider_GetTickerPrices(t *testing.T) { - p, err := NewBitgetProvider( - context.TODO(), - zerolog.Nop(), - Endpoint{}, - types.CurrencyPair{Base: "BTC", Quote: "USDT"}, - ) - require.NoError(t, err) - - t.Run("valid_request_single_ticker", func(t *testing.T) { - lastPrice := "34.69000000" - volume := "2396974.02000000" - instID := "ATOMUSDT" - - tickerMap := map[string]BitgetTicker{} - tickerMap[instID] = BitgetTicker{ - Arg: BitgetSubscriptionArg{ - Channel: "tickers", - InstID: instID, - }, - Data: []BitgetTickerData{ - { - InstID: instID, - Price: lastPrice, - Volume: volume, - }, - }, - } - - p.tickers = tickerMap - - prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "ATOM", Quote: "USDT"}) - require.NoError(t, err) - require.Len(t, prices, 1) - require.Equal(t, sdk.MustNewDecFromStr(lastPrice), prices["ATOMUSDT"].Price) - require.Equal(t, sdk.MustNewDecFromStr(volume), prices["ATOMUSDT"].Volume) - }) - - t.Run("valid_request_multi_ticker", func(t *testing.T) { - atomInstID := "ATOMUSDT" - atomLastPrice := "34.69000000" - lunaInstID := "LUNAUSDT" - lunaLastPrice := "41.35000000" - volume := "2396974.02000000" - - tickerMap := map[string]BitgetTicker{} - tickerMap[atomInstID] = BitgetTicker{ - Arg: BitgetSubscriptionArg{ - Channel: "tickers", - InstID: atomInstID, - }, - Data: []BitgetTickerData{ - { - InstID: atomInstID, - Price: atomLastPrice, - Volume: volume, - }, - }, - } - tickerMap[lunaInstID] = BitgetTicker{ - Arg: BitgetSubscriptionArg{ - Channel: "tickers", - InstID: lunaInstID, - }, - Data: []BitgetTickerData{ - { - InstID: lunaInstID, - Price: lunaLastPrice, - Volume: volume, - }, - }, - } - p.tickers = tickerMap - prices, err := p.GetTickerPrices( - types.CurrencyPair{Base: "ATOM", Quote: "USDT"}, - types.CurrencyPair{Base: "LUNA", Quote: "USDT"}, - ) - - require.NoError(t, err) - require.Len(t, prices, 2) - require.Equal(t, sdk.MustNewDecFromStr(atomLastPrice), prices["ATOMUSDT"].Price) - require.Equal(t, sdk.MustNewDecFromStr(volume), prices["ATOMUSDT"].Volume) - require.Equal(t, sdk.MustNewDecFromStr(lunaLastPrice), prices["LUNAUSDT"].Price) - require.Equal(t, sdk.MustNewDecFromStr(volume), prices["LUNAUSDT"].Volume) - }) - - t.Run("invalid_request_invalid_ticker", func(t *testing.T) { - prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "FOO", Quote: "BAR"}) - require.EqualError(t, err, "bitget failed to get ticker price for FOOBAR") - require.Nil(t, prices) - }) -} - -func TestBitgetProvider_GetCandlePrices(t *testing.T) { - p, err := NewBitgetProvider( - context.TODO(), - zerolog.Nop(), - Endpoint{}, - types.CurrencyPair{Base: "ATOM", Quote: "USDT"}, - ) - require.NoError(t, err) - - t.Run("valid_request_single_candle", func(t *testing.T) { - price := "34.689998626708984000" - volume := "2396974.000000000000000000" - timeStamp := int64(1000000) - - candle := BitgetCandle{ - TimeStamp: timeStamp, - Close: price, - Volume: volume, - Arg: BitgetSubscriptionArg{ - Channel: "candle15m", - InstID: "ATOMUSDT", - }, - } - - p.setCandlePair(candle) - - prices, err := p.GetCandlePrices(types.CurrencyPair{Base: "ATOM", Quote: "USDT"}) - require.NoError(t, err) - require.Len(t, prices, 1) - require.Equal(t, sdk.MustNewDecFromStr(price), prices["ATOMUSDT"][0].Price) - require.Equal(t, sdk.MustNewDecFromStr(volume), prices["ATOMUSDT"][0].Volume) - require.Equal(t, timeStamp, prices["ATOMUSDT"][0].TimeStamp) - }) - - t.Run("invalid_request_invalid_candle", func(t *testing.T) { - prices, err := p.GetCandlePrices(types.CurrencyPair{Base: "FOO", Quote: "BAR"}) - require.EqualError(t, err, "failed to get candles price for FOOBAR") - require.Nil(t, prices) - }) -} - -func TestBitgetProvider_SubscribeCurrencyPairs(t *testing.T) { - p, err := NewBitgetProvider( - context.TODO(), - zerolog.Nop(), - Endpoint{}, - types.CurrencyPair{Base: "ATOM", Quote: "USDT"}, - ) - require.NoError(t, err) - - t.Run("invalid_subscribe_channels_empty", func(t *testing.T) { - err = p.SubscribeCurrencyPairs([]types.CurrencyPair{}...) - require.ErrorContains(t, err, "currency pairs is empty") - }) -} - -func TestBitgetProvider_AvailablePairs(t *testing.T) { - p, err := NewBitgetProvider( - context.TODO(), - zerolog.Nop(), - Endpoint{}, - types.CurrencyPair{}, - ) - require.NoError(t, err) - - pairs, err := p.GetAvailablePairs() - require.NoError(t, err) - - require.NotEmpty(t, pairs) -} - -func TestBitgetProvider_NewSubscriptionMsg(t *testing.T) { - cps := []types.CurrencyPair{ - { - Base: "ATOM", Quote: "USDT", - }, - { - Base: "FOO", Quote: "BAR", - }, - } - sub := newBitgetTickerSubscriptionMsg(cps) - - require.Equal(t, len(sub.Args), 2*len(cps)) - require.Equal(t, sub.Args[0].InstID, "ATOMUSDT") - require.Equal(t, sub.Args[0].Channel, "ticker") - require.Equal(t, sub.Args[1].InstID, "ATOMUSDT") - require.Equal(t, sub.Args[1].Channel, "candle5m") - require.Equal(t, sub.Args[2].InstID, "FOOBAR") - require.Equal(t, sub.Args[2].Channel, "ticker") - require.Equal(t, sub.Args[3].InstID, "FOOBAR") - require.Equal(t, sub.Args[3].Channel, "candle5m") -} diff --git a/price-feeder/oracle/provider/coinbase.go b/price-feeder/oracle/provider/coinbase.go deleted file mode 100644 index 193ffab0e..000000000 --- a/price-feeder/oracle/provider/coinbase.go +++ /dev/null @@ -1,533 +0,0 @@ -package provider - -import ( - "context" - "encoding/json" - "fmt" - "net/http" - "net/url" - "sort" - "strings" - "sync" - "time" - - "github.com/gorilla/websocket" - "github.com/rs/zerolog" - - "github.com/CosmosContracts/juno/price-feeder/oracle/types" - sdk "github.com/cosmos/cosmos-sdk/types" -) - -const ( - coinbaseWSHost = "ws-feed.exchange.coinbase.com" - coinbasePingCheck = time.Second * 28 // should be < 30 - coinbaseRestHost = "https://api.exchange.coinbase.com" - coinbaseRestPath = "/products" - coinbaseTimeFmt = "2006-01-02T15:04:05.000000Z" - unixMinute = 60000 -) - -var _ Provider = (*CoinbaseProvider)(nil) - -type ( - // CoinbaseProvider defines an Oracle provider implemented by the Coinbase public - // API. - // - // REF: https://www.coinbase.io/docs/websocket/index.html - CoinbaseProvider struct { - wsURL url.URL - wsClient *websocket.Conn - logger zerolog.Logger - reconnectTimer *time.Ticker - mtx sync.RWMutex - endpoints Endpoint - trades map[string][]CoinbaseTrade // Symbol => []CoinbaseTrade - tickers map[string]CoinbaseTicker // Symbol => CoinbaseTicker - subscribedPairs map[string]types.CurrencyPair // Symbol => types.CurrencyPair - } - - // CoinbaseSubscriptionMsg Msg to subscribe to all channels. - CoinbaseSubscriptionMsg struct { - Type string `json:"type"` // ex. "subscribe" - ProductIDs []string `json:"product_ids"` // streams to subscribe ex.: ["BOT-USDT", ...] - Channels []string `json:"channels"` // channels to subscribe to ex.: "ticker" - } - - // CoinbaseMatchResponse defines the response body for coinbase trades. - CoinbaseTradeResponse struct { - Type string `json:"type"` // "last_match" or "match" - ProductID string `json:"product_id"` // ex.: ATOM-USDT - Time string `json:"time"` // Time in format 2006-01-02T15:04:05.000000Z - Size string `json:"size"` // Size of the trade ex.: 10.41 - Price string `json:"price"` // ex.: 14.02 - } - - // CoinbaseTrade defines the trade info we'd like to save. - CoinbaseTrade struct { - ProductID string // ex.: ATOM-USDT - Time int64 // Time in unix epoch ex.: 164732388700 - Size string // Size of the trade ex.: 10.41 - Price string // ex.: 14.02 - } - - // CoinbaseTicker defines the ticker info we'd like to save. - CoinbaseTicker struct { - ProductID string `json:"product_id"` // ex.: ATOM-USDT - Price string `json:"price"` // ex.: 523.0 - Volume string `json:"volume_24h"` // 24-hour volume - } - - // CoinbaseErrResponse defines the response body for errors. - CoinbaseErrResponse struct { - Type string `json:"type"` // should be "error" - Reason string `json:"reason"` // ex.: "tickers" is not a valid channel - } - - // CoinbasePairSummary defines the response structure for a Coinbase pair summary. - CoinbasePairSummary struct { - Base string `json:"base_currency"` - Quote string `json:"quote_currency"` - } -) - -// NewCoinbaseProvider creates a new CoinbaseProvider. -func NewCoinbaseProvider( - ctx context.Context, - logger zerolog.Logger, - endpoints Endpoint, - pairs ...types.CurrencyPair, -) (*CoinbaseProvider, error) { - if endpoints.Name != ProviderCoinbase { - endpoints = Endpoint{ - Name: ProviderCoinbase, - Rest: coinbaseRestHost, - Websocket: coinbaseWSHost, - } - } - wsURL := url.URL{ - Scheme: "wss", - Host: endpoints.Websocket, - } - - wsConn, resp, err := websocket.DefaultDialer.Dial(wsURL.String(), nil) - defer resp.Body.Close() - if err != nil { - return nil, fmt.Errorf( - types.ErrWebsocketDial.Error(), - ProviderCoinbase, - err, - ) - } - - provider := &CoinbaseProvider{ - wsURL: wsURL, - wsClient: wsConn, - logger: logger.With().Str("provider", string(ProviderCoinbase)).Logger(), - reconnectTimer: time.NewTicker(coinbasePingCheck), - endpoints: endpoints, - trades: map[string][]CoinbaseTrade{}, - tickers: map[string]CoinbaseTicker{}, - subscribedPairs: map[string]types.CurrencyPair{}, - } - provider.wsClient.SetPongHandler(provider.pongHandler) - - if err := provider.SubscribeCurrencyPairs(pairs...); err != nil { - return nil, err - } - - go provider.handleReceivedMessages(ctx) - - return provider, nil -} - -// GetTickerPrices returns the tickerPrices based on the saved map. -func (p *CoinbaseProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[string]types.TickerPrice, error) { - tickerPrices := make(map[string]types.TickerPrice, len(pairs)) - - for _, currencyPair := range pairs { - price, err := p.getTickerPrice(currencyPair) - if err != nil { - return nil, err - } - - tickerPrices[currencyPair.String()] = price - } - - return tickerPrices, nil -} - -// GetCandlePrices returns candles based off of the saved trades map. -// Candles need to be cut up into one-minute intervals. -func (p *CoinbaseProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[string][]types.CandlePrice, error) { - tradeMap := make(map[string][]CoinbaseTrade, len(pairs)) - - for _, cp := range pairs { - key := currencyPairToCoinbasePair(cp) - tradeSet, err := p.getTradePrices(key) - if err != nil { - return nil, err - } - tradeMap[key] = tradeSet - } - if len(tradeMap) == 0 { - return nil, fmt.Errorf("no trades have been received") - } - - candles := make(map[string][]types.CandlePrice) - - for cp := range tradeMap { - trades := tradeMap[cp] - // sort oldest -> newest - sort.Slice(trades, func(i, j int) bool { - return time.Unix(trades[i].Time, 0).Before(time.Unix(trades[j].Time, 0)) - }) - - candleSlice := []types.CandlePrice{ - { - Price: sdk.ZeroDec(), - Volume: sdk.ZeroDec(), - }, - } - startTime := trades[0].Time - index := 0 - - // divide into chunks by minute - for _, trade := range trades { - // every minute, reset the time period - if trade.Time-startTime > unixMinute { - index++ - startTime = trade.Time - candleSlice = append(candleSlice, types.CandlePrice{ - Price: sdk.ZeroDec(), - Volume: sdk.ZeroDec(), - }) - } - - size, err := sdk.NewDecFromStr(trade.Size) - if err != nil { - return nil, err - } - price, err := sdk.NewDecFromStr(trade.Price) - if err != nil { - return nil, err - } - - volume := candleSlice[index].Volume.Add(size) - candleSlice[index] = types.CandlePrice{ - Volume: volume, // aggregate size - Price: price, // most recent price - TimeStamp: trade.Time, // most recent timestamp - } - } - - candles[coinbasePairToCurrencyPair(cp)] = candleSlice - } - - return candles, nil -} - -// SubscribeCurrencyPairs subscribes to websockets for all currency pairs. -func (p *CoinbaseProvider) SubscribeCurrencyPairs(cps ...types.CurrencyPair) error { - if len(cps) == 0 { - return fmt.Errorf("currency pairs is empty") - } - - if err := p.subscribe(cps...); err != nil { - return err - } - - p.setSubscribedPairs(cps...) - telemetryWebsocketSubscribeCurrencyPairs(ProviderCoinbase, len(cps)) - return nil -} - -// GetAvailablePairs returns all pairs to which the provider can subscribe. -func (p *CoinbaseProvider) GetAvailablePairs() (map[string]struct{}, error) { - resp, err := http.Get(p.endpoints.Rest + coinbaseRestPath) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - var pairsSummary []CoinbasePairSummary - if err := json.NewDecoder(resp.Body).Decode(&pairsSummary); err != nil { - return nil, err - } - - availablePairs := make(map[string]struct{}, len(pairsSummary)) - for _, pair := range pairsSummary { - cp := types.CurrencyPair{ - Base: strings.ToUpper(pair.Base), - Quote: strings.ToUpper(pair.Quote), - } - availablePairs[cp.String()] = struct{}{} - } - - return availablePairs, nil -} - -// subscribe subscribes to the coinbase "ticker" and "match" websockets. -func (p *CoinbaseProvider) subscribe(cps ...types.CurrencyPair) error { - topics := make([]string, len(cps)) - index := 0 - - for _, cp := range cps { - topics[index] = currencyPairToCoinbasePair(cp) - index++ - } - - tickerMsg := newCoinbaseSubscription(topics...) - if err := p.subscribePairs(tickerMsg); err != nil { - return err - } - - return nil -} - -// subscribedPairsToSlice returns the map of subscribed pairs as a slice. -func (p *CoinbaseProvider) subscribedPairsToSlice() []types.CurrencyPair { - p.mtx.RLock() - defer p.mtx.RUnlock() - - return types.MapPairsToSlice(p.subscribedPairs) -} - -func (p *CoinbaseProvider) getTickerPrice(cp types.CurrencyPair) (types.TickerPrice, error) { - p.mtx.RLock() - defer p.mtx.RUnlock() - - gp := currencyPairToCoinbasePair(cp) - if tickerPair, ok := p.tickers[gp]; ok { - return tickerPair.toTickerPrice() - } - - return types.TickerPrice{}, fmt.Errorf("coinbase failed to get ticker price for %s", gp) -} - -func (p *CoinbaseProvider) getTradePrices(key string) ([]CoinbaseTrade, error) { - p.mtx.RLock() - defer p.mtx.RUnlock() - - trades, ok := p.trades[key] - if !ok { - return []CoinbaseTrade{}, fmt.Errorf("failed to get trades for %s", key) - } - - return trades, nil -} - -func (p *CoinbaseProvider) handleReceivedMessages(ctx context.Context) { - for { - select { - case <-ctx.Done(): - return - case <-time.After(defaultReadNewWSMessage): - messageType, bz, err := p.wsClient.ReadMessage() - if err != nil { - // if some error occurs continue to try to read the next message. - p.logger.Err(err).Msg("could not read message") - if err := p.ping(); err != nil { - p.logger.Err(err).Msg("could not send ping") - } - continue - } - - if len(bz) == 0 { - continue - } - - p.resetReconnectTimer() - p.messageReceived(messageType, bz) - - case <-p.reconnectTimer.C: // reset by the pongHandler. - if err := p.disconnect(); err != nil { - p.logger.Err(err).Msg("error disconnecting") - } - if err := p.reconnect(); err != nil { - p.logger.Err(err).Msg("error reconnecting") - } - } - } -} - -func (p *CoinbaseProvider) messageReceived(messageType int, bz []byte) { - if messageType != websocket.TextMessage { - return - } - - var coinbaseTrade CoinbaseTradeResponse - if err := json.Unmarshal(bz, &coinbaseTrade); err != nil { - p.logger.Error().Err(err).Msg("unable to unmarshal response") - return - } - - if coinbaseTrade.Type == "error" { - var coinbaseErr CoinbaseErrResponse - if err := json.Unmarshal(bz, &coinbaseErr); err != nil { - p.logger.Debug().Err(err).Msg("unable to unmarshal error response") - } - p.logger.Error().Msg(coinbaseErr.Reason) - return - } - - if coinbaseTrade.Type == "subscriptions" { // successful subscription message - return - } - - if coinbaseTrade.Type == "ticker" { - var coinbaseTicker CoinbaseTicker - if err := json.Unmarshal(bz, &coinbaseTicker); err != nil { - p.logger.Error().Err(err).Msg("unable to unmarshal response") - return - } - - p.setTickerPair(coinbaseTicker) - telemetryWebsocketMessage(ProviderCoinbase, MessageTypeTicker) - return - } - - telemetryWebsocketMessage(ProviderCoinbase, MessageTypeTrade) - p.setTradePair(coinbaseTrade) -} - -// timeToUnix converts a Time in format "2006-01-02T15:04:05.000000Z" to unix -func (tr CoinbaseTradeResponse) timeToUnix() int64 { - t, err := time.Parse(coinbaseTimeFmt, tr.Time) - if err != nil { - return 0 - } - return t.UnixMilli() -} - -func (tr CoinbaseTradeResponse) toTrade() CoinbaseTrade { - return CoinbaseTrade{ - Time: tr.timeToUnix(), - Price: tr.Price, - ProductID: tr.ProductID, - Size: tr.Size, - } -} - -func (p *CoinbaseProvider) setTickerPair(ticker CoinbaseTicker) { - p.mtx.Lock() - defer p.mtx.Unlock() - - p.tickers[ticker.ProductID] = ticker -} - -// setTradePair takes a CoinbaseTradeResponse, converts its date into unix epoch, -// and then will add it to a copy of the trade slice. Then it filters out any -// "stale" trades, and sets the trade slice in memory to the copy. -func (p *CoinbaseProvider) setTradePair(tradeResponse CoinbaseTradeResponse) { - p.mtx.Lock() - defer p.mtx.Unlock() - staleTime := PastUnixTime(providerCandlePeriod) - tradeList := []CoinbaseTrade{ - tradeResponse.toTrade(), - } - - for _, t := range p.trades[tradeResponse.ProductID] { - if staleTime < t.Time { - tradeList = append(tradeList, t) - } - } - p.trades[tradeResponse.ProductID] = tradeList -} - -// subscribePairs write the subscription msg to the provider. -func (p *CoinbaseProvider) subscribePairs(msg CoinbaseSubscriptionMsg) error { - return p.wsClient.WriteJSON(msg) -} - -// setSubscribedPairs sets N currency pairs to the map of subscribed pairs. -func (p *CoinbaseProvider) setSubscribedPairs(cps ...types.CurrencyPair) { - p.mtx.Lock() - defer p.mtx.Unlock() - - for _, cp := range cps { - p.subscribedPairs[cp.String()] = cp - } -} - -func (p *CoinbaseProvider) resetReconnectTimer() { - p.reconnectTimer.Reset(coinbasePingCheck) -} - -// disconnect disconnects the existing websocket connection. -func (p *CoinbaseProvider) disconnect() error { - err := p.wsClient.Close() - if err != nil { - return types.ErrProviderConnection.Wrapf("error closing Coinbase websocket %v", err) - } - return nil -} - -// reconnect creates a new websocket connection. If there’s a -// network problem, the system will automatically disable the connection. The -// connection will break automatically if the subscription is not established or -// data has not been pushed for more than 30 seconds. To keep the connection stable: -// 1. Set a timer of N seconds whenever a response message is received, where N is -// less than 30. -// 2. If the timer is triggered, which means that no new message is received within -// N seconds, send the String 'ping'. -// 3. Expect a 'pong' as a response. If the response message is not received within -// N seconds, please raise an error or reconnect. -func (p *CoinbaseProvider) reconnect() error { - p.logger.Debug().Msg("reconnecting websocket") - wsConn, resp, err := websocket.DefaultDialer.Dial(p.wsURL.String(), nil) - defer resp.Body.Close() - if err != nil { - return fmt.Errorf( - types.ErrWebsocketDial.Error(), - ProviderCoinbase, - err, - ) - } - wsConn.SetPongHandler(p.pongHandler) - p.wsClient = wsConn - - currencyPairs := p.subscribedPairsToSlice() - - telemetryWebsocketReconnect(ProviderCoinbase) - return p.SubscribeCurrencyPairs(currencyPairs...) -} - -// ping to check websocket connection. -func (p *CoinbaseProvider) ping() error { - return p.wsClient.WriteMessage(websocket.PingMessage, ping) -} - -func (p *CoinbaseProvider) pongHandler(appData string) error { - p.resetReconnectTimer() - return nil -} - -func (ticker CoinbaseTicker) toTickerPrice() (types.TickerPrice, error) { - return types.NewTickerPrice( - string(ProviderCoinbase), - coinbasePairToCurrencyPair(ticker.ProductID), - ticker.Price, - ticker.Volume, - ) -} - -// currencyPairToCoinbasePair returns the expected pair for Coinbase -// ex.: "ATOM-USDT". -func currencyPairToCoinbasePair(pair types.CurrencyPair) string { - return pair.Base + "-" + pair.Quote -} - -// coinbasePairToCurrencyPair returns the currency pair string -// ex.: "ATOMUSDT". -func coinbasePairToCurrencyPair(coinbasePair string) string { - return strings.ReplaceAll(coinbasePair, "-", "") -} - -// newCoinbaseSubscription returns a new subscription topic for matches/tickers. -func newCoinbaseSubscription(cp ...string) CoinbaseSubscriptionMsg { - return CoinbaseSubscriptionMsg{ - Type: "subscribe", - ProductIDs: cp, - Channels: []string{"matches", "ticker"}, - } -} diff --git a/price-feeder/oracle/provider/coinbase_test.go b/price-feeder/oracle/provider/coinbase_test.go deleted file mode 100644 index 841030874..000000000 --- a/price-feeder/oracle/provider/coinbase_test.go +++ /dev/null @@ -1,102 +0,0 @@ -package provider - -import ( - "context" - "testing" - - "github.com/CosmosContracts/juno/price-feeder/oracle/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/rs/zerolog" - "github.com/stretchr/testify/require" -) - -func TestCoinbaseProvider_GetTickerPrices(t *testing.T) { - p, err := NewCoinbaseProvider( - context.TODO(), - zerolog.Nop(), - Endpoint{}, - types.CurrencyPair{Base: "BTC", Quote: "USDT"}, - ) - require.NoError(t, err) - - t.Run("valid_request_single_ticker", func(t *testing.T) { - lastPrice := "34.69000000" - volume := "2396974.02000000" - - tickerMap := map[string]CoinbaseTicker{} - tickerMap["ATOM-USDT"] = CoinbaseTicker{ - Price: lastPrice, - Volume: volume, - } - - p.tickers = tickerMap - - prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "ATOM", Quote: "USDT"}) - require.NoError(t, err) - require.Len(t, prices, 1) - require.Equal(t, sdk.MustNewDecFromStr(lastPrice), prices["ATOMUSDT"].Price) - require.Equal(t, sdk.MustNewDecFromStr(volume), prices["ATOMUSDT"].Volume) - }) - - t.Run("valid_request_multi_ticker", func(t *testing.T) { - lastPriceAtom := "34.69000000" - lastPriceUmee := "41.35000000" - volume := "2396974.02000000" - - tickerMap := map[string]CoinbaseTicker{} - tickerMap["ATOM-USDT"] = CoinbaseTicker{ - Price: lastPriceAtom, - Volume: volume, - } - - tickerMap["UMEE-USDT"] = CoinbaseTicker{ - Price: lastPriceUmee, - Volume: volume, - } - - p.tickers = tickerMap - prices, err := p.GetTickerPrices( - types.CurrencyPair{Base: "ATOM", Quote: "USDT"}, - types.CurrencyPair{Base: "UMEE", Quote: "USDT"}, - ) - require.NoError(t, err) - require.Len(t, prices, 2) - require.Equal(t, sdk.MustNewDecFromStr(lastPriceAtom), prices["ATOMUSDT"].Price) - require.Equal(t, sdk.MustNewDecFromStr(volume), prices["ATOMUSDT"].Volume) - require.Equal(t, sdk.MustNewDecFromStr(lastPriceUmee), prices["UMEEUSDT"].Price) - require.Equal(t, sdk.MustNewDecFromStr(volume), prices["UMEEUSDT"].Volume) - }) - - t.Run("invalid_request_invalid_ticker", func(t *testing.T) { - prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "FOO", Quote: "BAR"}) - require.EqualError(t, err, "coinbase failed to get ticker price for FOO-BAR") - require.Nil(t, prices) - }) -} - -func TestCoinbaseProvider_SubscribeCurrencyPairs(t *testing.T) { - p, err := NewCoinbaseProvider( - context.TODO(), - zerolog.Nop(), - Endpoint{}, - types.CurrencyPair{Base: "ATOM", Quote: "USDT"}, - ) - require.NoError(t, err) - - t.Run("invalid_subscribe_channels_empty", func(t *testing.T) { - err = p.SubscribeCurrencyPairs([]types.CurrencyPair{}...) - require.ErrorContains(t, err, "currency pairs is empty") - }) -} - -func TestCoinbasePairToCurrencyPair(t *testing.T) { - cp := types.CurrencyPair{Base: "ATOM", Quote: "USDT"} - currencyPairSymbol := coinbasePairToCurrencyPair("ATOM-USDT") - require.Equal(t, cp.String(), currencyPairSymbol) -} - -func TestCurrencyPairToCoinbasePair(t *testing.T) { - cp := types.CurrencyPair{Base: "ATOM", Quote: "USDT"} - coinbaseSymbol := currencyPairToCoinbasePair(cp) - require.Equal(t, coinbaseSymbol, "ATOM-USDT") -} diff --git a/price-feeder/oracle/provider/crypto.go b/price-feeder/oracle/provider/crypto.go deleted file mode 100644 index 7d6a0a3cb..000000000 --- a/price-feeder/oracle/provider/crypto.go +++ /dev/null @@ -1,542 +0,0 @@ -package provider - -import ( - "context" - "encoding/json" - "fmt" - "net/http" - "net/url" - "strings" - "sync" - "time" - - "github.com/CosmosContracts/juno/price-feeder/oracle/types" - "github.com/gorilla/websocket" - "github.com/rs/zerolog" - - "github.com/CosmosContracts/juno/price-feeder/oracle/util" -) - -const ( - cryptoWSHost = "stream.crypto.com" - cryptoWSPath = "/v2/market" - cryptoReconnectTime = time.Second * 30 - cryptoRestHost = "https://api.crypto.com" - cryptoRestPath = "/v2/public/get-ticker" - cryptoTickerChannel = "ticker" - cryptoCandleChannel = "candlestick" - cryptoHeartbeatMethod = "public/heartbeat" - cryptoHeartbeatReqMethod = "public/respond-heartbeat" - cryptoTickerMsgPrefix = "ticker." - cryptoCandleMsgPrefix = "candlestick.5m." -) - -var _ Provider = (*CryptoProvider)(nil) - -type ( - // CryptoProvider defines an Oracle provider implemented by the Crypto.com public - // API. - // - // REF: https://exchange-docs.crypto.com/spot/index.html#introduction - CryptoProvider struct { - wsURL url.URL - wsClient *websocket.Conn - logger zerolog.Logger - mtx sync.RWMutex - endpoints Endpoint - tickers map[string]types.TickerPrice // Symbol => TickerPrice - candles map[string][]types.CandlePrice // Symbol => CandlePrice - subscribedPairs map[string]types.CurrencyPair // Symbol => types.CurrencyPair - } - - CryptoTickerResponse struct { - Result CryptoTickerResult `json:"result"` - } - CryptoTickerResult struct { - InstrumentName string `json:"instrument_name"` // ex.: ATOM_USDT - Channel string `json:"channel"` // ex.: ticker - Data []CryptoTicker `json:"data"` // ticker data - } - CryptoTicker struct { - InstrumentName string `json:"i"` // Instrument Name, e.g. BTC_USDT, ETH_CRO, etc. - Volume float64 `json:"v"` // The total 24h traded volume - LatestTrade float64 `json:"a"` // The price of the latest trade, null if there weren't any trades - } - - CryptoCandleResponse struct { - Result CryptoCandleResult `json:"result"` - } - CryptoCandleResult struct { - InstrumentName string `json:"instrument_name"` // ex.: ATOM_USDT - Channel string `json:"channel"` // ex.: candlestick - Data []CryptoCandle `json:"data"` // candlestick data - } - CryptoCandle struct { - Close float64 `json:"c"` // Price at close - Volume float64 `json:"v"` // Volume during interval - Timestamp int64 `json:"t"` // End time of candlestick (Unix timestamp) - } - - CryptoSubscriptionMsg struct { - ID int64 `json:"id"` - Method string `json:"method"` // subscribe, unsubscribe - Params CryptoSubscriptionParams `json:"params"` - Nonce int64 `json:"nonce"` // Current timestamp (milliseconds since the Unix epoch) - } - CryptoSubscriptionParams struct { - Channels []string `json:"channels"` // Channels to be subscribed ex. ticker.ATOM_USDT - } - - CryptoPairsSummary struct { - Result CryptoInstruments `json:"result"` - } - CryptoInstruments struct { - Data []CryptoTicker `json:"data"` - } - - CryptoHeartbeatResponse struct { - ID int64 `json:"id"` - Method string `json:"method"` // public/heartbeat - } - CryptoHeartbeatRequest struct { - ID int64 `json:"id"` - Method string `json:"method"` // public/respond-heartbeat - } -) - -func NewCryptoProvider( - ctx context.Context, - logger zerolog.Logger, - endpoints Endpoint, - pairs ...types.CurrencyPair, -) (*CryptoProvider, error) { - if endpoints.Name != ProviderCrypto { - endpoints = Endpoint{ - Name: ProviderCrypto, - Rest: cryptoRestHost, - Websocket: cryptoWSHost, - } - } - - wsURL := url.URL{ - Scheme: "wss", - Host: endpoints.Websocket, - Path: cryptoWSPath, - } - - wsConn, resp, err := websocket.DefaultDialer.Dial(wsURL.String(), nil) - if err != nil { - return nil, fmt.Errorf( - types.ErrWebsocketDial.Error(), - ProviderCrypto, - err, - ) - } - defer resp.Body.Close() - - provider := &CryptoProvider{ - wsURL: wsURL, - wsClient: wsConn, - logger: logger.With().Str("provider", "crypto").Logger(), - endpoints: endpoints, - tickers: map[string]types.TickerPrice{}, - candles: map[string][]types.CandlePrice{}, - subscribedPairs: map[string]types.CurrencyPair{}, - } - - if err := provider.SubscribeCurrencyPairs(pairs...); err != nil { - return nil, err - } - - go provider.handleWebSocketMsgs(ctx) - - return provider, nil -} - -// GetTickerPrices returns the tickerPrices based on the saved map. -func (p *CryptoProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[string]types.TickerPrice, error) { - tickerPrices := make(map[string]types.TickerPrice, len(pairs)) - - for _, cp := range pairs { - key := currencyPairToCryptoPair(cp) - price, err := p.getTickerPrice(key) - if err != nil { - return nil, err - } - tickerPrices[cp.String()] = price - } - - return tickerPrices, nil -} - -// GetCandlePrices returns the candlePrices based on the saved map -func (p *CryptoProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[string][]types.CandlePrice, error) { - candlePrices := make(map[string][]types.CandlePrice, len(pairs)) - - for _, cp := range pairs { - key := currencyPairToCryptoPair(cp) - prices, err := p.getCandlePrices(key) - if err != nil { - return nil, err - } - candlePrices[cp.String()] = prices - } - - return candlePrices, nil -} - -// SubscribeCurrencyPairs subscribe all currency pairs into ticker and candle channels. -func (p *CryptoProvider) SubscribeCurrencyPairs(cps ...types.CurrencyPair) error { - if len(cps) == 0 { - return fmt.Errorf("currency pairs is empty") - } - - if err := p.subscribeChannels(cps...); err != nil { - return err - } - - p.setSubscribedPairs(cps...) - telemetryWebsocketSubscribeCurrencyPairs(ProviderCrypto, len(cps)) - return nil -} - -// subscribeChannels subscribe all currency pairs into ticker and candle channels. -func (p *CryptoProvider) subscribeChannels(cps ...types.CurrencyPair) error { - if err := p.subscribeTickers(cps...); err != nil { - return err - } - - return p.subscribeCandles(cps...) -} - -// subscribeTickers subscribe all currency pairs into ticker channel. -func (p *CryptoProvider) subscribeTickers(cps ...types.CurrencyPair) error { - pairs := make([]string, len(cps)) - - for i, cp := range cps { - pairs[i] = currencyPairToCryptoPair(cp) - } - - channels := []string{} - for _, pair := range pairs { - channels = append(channels, cryptoTickerMsgPrefix+pair) - } - subsMsg := newCryptoSubscriptionMsg(channels) - err := p.wsClient.WriteJSON(subsMsg) - - return err -} - -// subscribeCandles subscribe all currency pairs into candle channel. -func (p *CryptoProvider) subscribeCandles(cps ...types.CurrencyPair) error { - pairs := make([]string, len(cps)) - - for i, cp := range cps { - pairs[i] = currencyPairToCryptoPair(cp) - } - - channels := []string{} - for _, pair := range pairs { - channels = append(channels, cryptoCandleMsgPrefix+pair) - } - subsMsg := newCryptoSubscriptionMsg(channels) - err := p.wsClient.WriteJSON(subsMsg) - - return err -} - -// subscribedPairsToSlice returns the map of subscribed pairs as a slice. -func (p *CryptoProvider) subscribedPairsToSlice() []types.CurrencyPair { - p.mtx.RLock() - defer p.mtx.RUnlock() - - return types.MapPairsToSlice(p.subscribedPairs) -} - -func (p *CryptoProvider) getTickerPrice(key string) (types.TickerPrice, error) { - p.mtx.RLock() - defer p.mtx.RUnlock() - - ticker, ok := p.tickers[key] - if !ok { - return types.TickerPrice{}, fmt.Errorf( - types.ErrTickerNotFound.Error(), - ProviderCrypto, - key, - ) - } - - return ticker, nil -} - -func (p *CryptoProvider) getCandlePrices(key string) ([]types.CandlePrice, error) { - p.mtx.RLock() - defer p.mtx.RUnlock() - - candles, ok := p.candles[key] - if !ok { - return []types.CandlePrice{}, fmt.Errorf( - types.ErrCandleNotFound.Error(), - ProviderCrypto, - key, - ) - } - - return candles, nil -} - -func (p *CryptoProvider) messageReceived(messageType int, bz []byte, reconnectTicker *time.Ticker) { - if messageType != websocket.TextMessage { - return - } - - var ( - heartbeatResp CryptoHeartbeatResponse - heartbeatErr error - tickerResp CryptoTickerResponse - tickerErr error - candleResp CryptoCandleResponse - candleErr error - ) - - // sometimes the message received is not a ticker or a candle response. - heartbeatErr = json.Unmarshal(bz, &heartbeatResp) - if heartbeatResp.Method == cryptoHeartbeatMethod { - p.pong(heartbeatResp, reconnectTicker) - return - } - - tickerErr = json.Unmarshal(bz, &tickerResp) - if tickerResp.Result.Channel == cryptoTickerChannel { - for _, tickerPair := range tickerResp.Result.Data { - p.setTickerPair( - tickerResp.Result.InstrumentName, - tickerPair, - ) - telemetryWebsocketMessage(ProviderCrypto, MessageTypeTicker) - } - return - } - - candleErr = json.Unmarshal(bz, &candleResp) - if candleResp.Result.Channel == cryptoCandleChannel { - for _, candlePair := range candleResp.Result.Data { - p.setCandlePair( - candleResp.Result.InstrumentName, - candlePair, - ) - telemetryWebsocketMessage(ProviderCrypto, MessageTypeCandle) - } - return - } - - p.logger.Error(). - Int("length", len(bz)). - AnErr("heartbeat", heartbeatErr). - AnErr("ticker", tickerErr). - AnErr("candle", candleErr). - Msg("Error on receive message") -} - -// pong return a heartbeat message when a "ping" is received and reset the -// recconnect ticker because the connection is alive. After connected to crypto.com's -// Websocket server, the server will send heartbeat periodically (30s interval). -// When client receives an heartbeat message, it must respond back with the -// public/respond-heartbeat method, using the same matching id, -// within 5 seconds, or the connection will break. -func (p *CryptoProvider) pong(heartbeatResp CryptoHeartbeatResponse, reconnectTicker *time.Ticker) { - reconnectTicker.Reset(cryptoReconnectTime) - - heartbeatReq := CryptoHeartbeatRequest{ - ID: heartbeatResp.ID, - Method: cryptoHeartbeatReqMethod, - } - - if err := p.wsClient.WriteJSON(heartbeatReq); err != nil { - p.logger.Err(err).Msg("could not send pong message back") - } -} - -// ping to check websocket connection -func (p *CryptoProvider) ping() error { - return p.wsClient.WriteMessage(websocket.PingMessage, ping) -} - -func (p *CryptoProvider) setTickerPair(symbol string, tickerPair CryptoTicker) { - p.mtx.Lock() - defer p.mtx.Unlock() - - price, err := util.NewDecFromFloat(tickerPair.LatestTrade) - if err != nil { - p.logger.Warn().Err(err).Msg("crypto: failed to parse ticker price") - return - } - volume, err := util.NewDecFromFloat(tickerPair.Volume) - if err != nil { - p.logger.Warn().Err(err).Msg("crypto: failed to parse ticker volume") - return - } - - p.tickers[symbol] = types.TickerPrice{ - Price: price, - Volume: volume, - } -} - -func (p *CryptoProvider) setCandlePair(symbol string, candlePair CryptoCandle) { - p.mtx.Lock() - defer p.mtx.Unlock() - - close, err := util.NewDecFromFloat(candlePair.Close) - if err != nil { - p.logger.Warn().Err(err).Msg("crypto: failed to parse candle close") - return - } - volume, err := util.NewDecFromFloat(candlePair.Volume) - if err != nil { - p.logger.Warn().Err(err).Msg("crypto: failed to parse candle volume") - return - } - candle := types.CandlePrice{ - Price: close, - Volume: volume, - // convert seconds -> milli - TimeStamp: SecondsToMilli(candlePair.Timestamp), - } - - staleTime := PastUnixTime(providerCandlePeriod) - candleList := []types.CandlePrice{} - candleList = append(candleList, candle) - - for _, c := range p.candles[symbol] { - if staleTime < c.TimeStamp { - candleList = append(candleList, c) - } - } - - p.candles[symbol] = candleList -} - -func (p *CryptoProvider) handleWebSocketMsgs(ctx context.Context) { - reconnectTicker := time.NewTicker(cryptoReconnectTime) - defer reconnectTicker.Stop() - - for { - select { - case <-ctx.Done(): - return - case <-time.After(defaultReadNewWSMessage): - messageType, bz, err := p.wsClient.ReadMessage() - if err != nil { - // If some error occurs, check if connection is alive - // and continue to try to read the next message. - p.logger.Err(err).Msg("failed to read message") - if err := p.ping(); err != nil { - p.logger.Err(err).Msg("failed to send ping") - if err := p.reconnect(); err != nil { - p.logger.Err(err).Msg("error reconnecting websocket") - } - } - continue - } - - if len(bz) == 0 { - continue - } - - p.messageReceived(messageType, bz, reconnectTicker) - - case <-reconnectTicker.C: - if err := p.reconnect(); err != nil { - p.logger.Err(err).Msg("error reconnecting") - } - } - } -} - -// reconnect closes the last WS connection then create a new one and subscribes to -// all subscribed pairs in the ticker and candle pairs. If no ping is received -// within 1 minute, the connection will be disconnected. It is recommended to -// send a ping for 10-20 seconds -func (p *CryptoProvider) reconnect() error { - err := p.wsClient.Close() - if err != nil { - p.logger.Err(err).Msg("error closing crypto websocket") - } - - p.logger.Debug().Msg("crypto: reconnecting websocket") - - wsConn, resp, err := websocket.DefaultDialer.Dial(p.wsURL.String(), nil) - defer resp.Body.Close() - if err != nil { - return fmt.Errorf( - types.ErrWebsocketDial.Error(), - ProviderCrypto, - err, - ) - } - p.wsClient = wsConn - telemetryWebsocketReconnect(ProviderCrypto) - - return p.subscribeChannels(p.subscribedPairsToSlice()...) -} - -// setSubscribedPairs sets N currency pairs to the map of subscribed pairs. -func (p *CryptoProvider) setSubscribedPairs(cps ...types.CurrencyPair) { - p.mtx.Lock() - defer p.mtx.Unlock() - - for _, cp := range cps { - p.subscribedPairs[cp.String()] = cp - } -} - -// GetAvailablePairs returns all pairs to which the provider can subscribe. -// ex.: map["ATOMUSDT" => {}, "UMEEUSDC" => {}]. -func (p *CryptoProvider) GetAvailablePairs() (map[string]struct{}, error) { - resp, err := http.Get(p.endpoints.Rest + cryptoRestPath) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - var pairsSummary CryptoPairsSummary - if err := json.NewDecoder(resp.Body).Decode(&pairsSummary); err != nil { - return nil, err - } - - availablePairs := make(map[string]struct{}, len(pairsSummary.Result.Data)) - for _, pair := range pairsSummary.Result.Data { - splitInstName := strings.Split(pair.InstrumentName, "_") - if len(splitInstName) != 2 { - continue - } - - cp := types.CurrencyPair{ - Base: strings.ToUpper(splitInstName[0]), - Quote: strings.ToUpper(splitInstName[1]), - } - - availablePairs[cp.String()] = struct{}{} - } - - return availablePairs, nil -} - -// currencyPairToCryptoPair receives a currency pair and return crypto -// ticker symbol atomusdt@ticker. -func currencyPairToCryptoPair(cp types.CurrencyPair) string { - return strings.ToUpper(cp.Base + "_" + cp.Quote) -} - -// newCryptoSubscriptionMsg returns a new subscription Msg. -func newCryptoSubscriptionMsg(channels []string) CryptoSubscriptionMsg { - return CryptoSubscriptionMsg{ - ID: 1, - Method: "subscribe", - Params: CryptoSubscriptionParams{ - Channels: channels, - }, - Nonce: time.Now().UnixMilli(), - } -} diff --git a/price-feeder/oracle/provider/crypto_test.go b/price-feeder/oracle/provider/crypto_test.go deleted file mode 100644 index 772b64611..000000000 --- a/price-feeder/oracle/provider/crypto_test.go +++ /dev/null @@ -1,135 +0,0 @@ -package provider - -import ( - "context" - "testing" - - "github.com/CosmosContracts/juno/price-feeder/oracle/types" - "github.com/CosmosContracts/juno/price-feeder/oracle/util" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/rs/zerolog" - "github.com/stretchr/testify/require" -) - -func TestCryptoProvider_GetTickerPrices(t *testing.T) { - p, err := NewCryptoProvider( - context.TODO(), - zerolog.Nop(), - Endpoint{}, - types.CurrencyPair{Base: "ATOM", Quote: "USDT"}, - ) - require.NoError(t, err) - - t.Run("valid_request_single_ticker", func(t *testing.T) { - lastPrice := sdk.MustNewDecFromStr("34.69000000") - volume := sdk.MustNewDecFromStr("2396974.02000000") - - tickerMap := map[string]types.TickerPrice{} - tickerMap["ATOM_USDT"] = types.TickerPrice{ - Price: lastPrice, - Volume: volume, - } - - p.tickers = tickerMap - - prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "ATOM", Quote: "USDT"}) - require.NoError(t, err) - require.Len(t, prices, 1) - require.Equal(t, lastPrice, prices["ATOMUSDT"].Price) - require.Equal(t, volume, prices["ATOMUSDT"].Volume) - }) - - t.Run("valid_request_multi_ticker", func(t *testing.T) { - lastPriceAtom := sdk.MustNewDecFromStr("34.69000000") - lastPriceLuna := sdk.MustNewDecFromStr("41.35000000") - volume := sdk.MustNewDecFromStr("2396974.02000000") - - tickerMap := map[string]types.TickerPrice{} - tickerMap["ATOM_USDT"] = types.TickerPrice{ - Price: lastPriceAtom, - Volume: volume, - } - - tickerMap["LUNA_USDT"] = types.TickerPrice{ - Price: lastPriceLuna, - Volume: volume, - } - - p.tickers = tickerMap - prices, err := p.GetTickerPrices( - types.CurrencyPair{Base: "ATOM", Quote: "USDT"}, - types.CurrencyPair{Base: "LUNA", Quote: "USDT"}, - ) - require.NoError(t, err) - require.Len(t, prices, 2) - require.Equal(t, lastPriceAtom, prices["ATOMUSDT"].Price) - require.Equal(t, volume, prices["ATOMUSDT"].Volume) - require.Equal(t, lastPriceLuna, prices["LUNAUSDT"].Price) - require.Equal(t, volume, prices["LUNAUSDT"].Volume) - }) - - t.Run("invalid_request_invalid_ticker", func(t *testing.T) { - prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "FOO", Quote: "BAR"}) - require.Error(t, err) - require.Equal(t, "crypto failed to get ticker price for FOO_BAR", err.Error()) - require.Nil(t, prices) - }) -} - -func TestCryptoProvider_GetCandlePrices(t *testing.T) { - p, err := NewCryptoProvider( - context.TODO(), - zerolog.Nop(), - Endpoint{}, - types.CurrencyPair{Base: "ATOM", Quote: "USDT"}, - ) - require.NoError(t, err) - - t.Run("valid_request_single_candle", func(t *testing.T) { - price := 34.689998626708984000 - volume := 2396974.000000000000000000 - timeStamp := int64(1000000) - - candle := CryptoCandle{ - Volume: volume, - Close: price, - Timestamp: timeStamp, - } - - p.setCandlePair("ATOM_USDT", candle) - - prices, err := p.GetCandlePrices(types.CurrencyPair{Base: "ATOM", Quote: "USDT"}) - require.NoError(t, err) - require.Len(t, prices, 1) - require.Equal(t, util.MustNewDecFromFloat(price), prices["ATOMUSDT"][0].Price) - require.Equal(t, util.MustNewDecFromFloat(volume), prices["ATOMUSDT"][0].Volume) - require.Equal(t, timeStamp*1000, prices["ATOMUSDT"][0].TimeStamp) - }) - - t.Run("invalid_request_invalid_candle", func(t *testing.T) { - prices, err := p.GetCandlePrices(types.CurrencyPair{Base: "FOO", Quote: "BAR"}) - require.EqualError(t, err, "crypto failed to get candle price for FOO_BAR") - require.Nil(t, prices) - }) -} - -func TestCryptoProvider_SubscribeCurrencyPairs(t *testing.T) { - p, err := NewOkxProvider( - context.TODO(), - zerolog.Nop(), - Endpoint{}, - types.CurrencyPair{Base: "ATOM", Quote: "USDT"}, - ) - require.NoError(t, err) - - t.Run("invalid_subscribe_channels_empty", func(t *testing.T) { - err = p.SubscribeCurrencyPairs([]types.CurrencyPair{}...) - require.ErrorContains(t, err, "currency pairs is empty") - }) -} - -func TestCryptoCurrencyPairToCryptoPair(t *testing.T) { - cp := types.CurrencyPair{Base: "ATOM", Quote: "USDT"} - cryptoSymbol := currencyPairToCryptoPair(cp) - require.Equal(t, cryptoSymbol, "ATOM_USDT") -} diff --git a/price-feeder/oracle/provider/gate.go b/price-feeder/oracle/provider/gate.go deleted file mode 100644 index 329e92aad..000000000 --- a/price-feeder/oracle/provider/gate.go +++ /dev/null @@ -1,638 +0,0 @@ -package provider - -import ( - "context" - "encoding/json" - "fmt" - "net/http" - "net/url" - "strings" - "sync" - "time" - - "github.com/gorilla/websocket" - "github.com/rs/zerolog" - - "github.com/CosmosContracts/juno/price-feeder/oracle/types" -) - -const ( - gateWSHost = "ws.gate.io" - gateWSPath = "/v3" - gatePingCheck = time.Second * 28 // should be < 30 - gateRestHost = "https://api.gateio.ws" - gateRestPath = "/api/v4/spot/currency_pairs" -) - -var _ Provider = (*GateProvider)(nil) - -type ( - // GateProvider defines an Oracle provider implemented by the Gate public - // API. - // - // REF: https://www.gate.io/docs/websocket/index.html - GateProvider struct { - wsURL url.URL - wsClient *websocket.Conn - logger zerolog.Logger - reconnectTimer *time.Ticker - mtx sync.RWMutex - endpoints Endpoint - tickers map[string]GateTicker // Symbol => GateTicker - candles map[string][]GateCandle // Symbol => GateCandle - subscribedPairs map[string]types.CurrencyPair // Symbol => types.CurrencyPair - } - - GateTicker struct { - Last string `json:"last"` // Last traded price ex.: 43508.9 - Vol string `json:"baseVolume"` // Trading volume ex.: 11159.87127845 - Symbol string `json:"symbol"` // Symbol ex.: ATOM_UDST - } - - GateCandle struct { - Close string // Closing price - TimeStamp int64 // Unix timestamp - Volume string // Total candle volume - Symbol string // Total symbol - } - - // GateTickerSubscriptionMsg Msg to subscribe all the tickers channels. - GateTickerSubscriptionMsg struct { - Method string `json:"method"` // ticker.subscribe - Params []string `json:"params"` // streams to subscribe ex.: BOT_USDT - ID uint16 `json:"id"` // identify messages going back and forth - } - - // GateCandleSubscriptionMsg Msg to subscribe to a candle channel. - GateCandleSubscriptionMsg struct { - Method string `json:"method"` // ticker.subscribe - Params []interface{} `json:"params"` // streams to subscribe ex.: ["BOT_USDT": 1800] - ID uint16 `json:"id"` // identify messages going back and forth - } - - // GateTickerResponse defines the response body for gate tickers. - GateTickerResponse struct { - Method string `json:"method"` - Params []interface{} `json:"params"` - } - - // GateTickerResponse defines the response body for gate tickers. - // The Params response is a 2D slice of multiple candles and their data. - // - // REF: https://www.gate.io/docs/websocket/index.html - GateCandleResponse struct { - Method string `json:"method"` - Params [][]interface{} `json:"params"` - } - - // GateEvent defines the response body for gate subscription statuses. - GateEvent struct { - ID int `json:"id"` // subscription id, ex.: 123 - Result GateEventResult `json:"result"` // event result body - } - // GateEventResult defines the Result body for the GateEvent response. - GateEventResult struct { - Status string `json:"status"` // ex. "successful" - } - - // GatePairSummary defines the response structure for a Gate pair summary. - GatePairSummary struct { - Base string `json:"base"` - Quote string `json:"quote"` - } -) - -// NewGateProvider creates a new GateProvider. -func NewGateProvider( - ctx context.Context, - logger zerolog.Logger, - endpoints Endpoint, - pairs ...types.CurrencyPair, -) (*GateProvider, error) { - if endpoints.Name != ProviderGate { - endpoints = Endpoint{ - Name: ProviderGate, - Rest: gateRestHost, - Websocket: gateWSHost, - } - } - - wsURL := url.URL{ - Scheme: "wss", - Host: endpoints.Websocket, - Path: gateWSPath, - } - - wsConn, resp, err := websocket.DefaultDialer.Dial(wsURL.String(), nil) - defer resp.Body.Close() - if err != nil { - return nil, fmt.Errorf( - types.ErrWebsocketDial.Error(), - ProviderGate, - err, - ) - } - - provider := &GateProvider{ - wsURL: wsURL, - wsClient: wsConn, - logger: logger.With().Str("provider", string(ProviderGate)).Logger(), - reconnectTimer: time.NewTicker(gatePingCheck), - endpoints: endpoints, - tickers: map[string]GateTicker{}, - candles: map[string][]GateCandle{}, - subscribedPairs: map[string]types.CurrencyPair{}, - } - provider.wsClient.SetPongHandler(provider.pongHandler) - - if err := provider.SubscribeCurrencyPairs(pairs...); err != nil { - return nil, err - } - - go provider.handleReceivedTickers(ctx) - - return provider, nil -} - -// GetTickerPrices returns the tickerPrices based on the saved map. -func (p *GateProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[string]types.TickerPrice, error) { - tickerPrices := make(map[string]types.TickerPrice, len(pairs)) - - for _, currencyPair := range pairs { - price, err := p.getTickerPrice(currencyPair) - if err != nil { - return nil, err - } - - tickerPrices[currencyPair.String()] = price - } - - return tickerPrices, nil -} - -// GetCandlePrices returns the candlePrices based on the saved map -func (p *GateProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[string][]types.CandlePrice, error) { - candlePrices := make(map[string][]types.CandlePrice, len(pairs)) - - for _, currencyPair := range pairs { - gp := currencyPairToGatePair(currencyPair) - price, err := p.getCandlePrices(gp) - if err != nil { - return nil, err - } - - candlePrices[currencyPair.String()] = price - } - - return candlePrices, nil -} - -func (p *GateProvider) getCandlePrices(key string) ([]types.CandlePrice, error) { - p.mtx.RLock() - defer p.mtx.RUnlock() - - candles, ok := p.candles[key] - if !ok { - return []types.CandlePrice{}, fmt.Errorf("gate failed to get candle prices for %s", key) - } - - candleList := []types.CandlePrice{} - for _, candle := range candles { - cp, err := candle.toCandlePrice() - if err != nil { - return []types.CandlePrice{}, err - } - - candleList = append(candleList, cp) - } - - return candleList, nil -} - -// SubscribeCurrencyPairs subscribe to ticker and candle channels for all pairs. -func (p *GateProvider) SubscribeCurrencyPairs(cps ...types.CurrencyPair) error { - if len(cps) == 0 { - return fmt.Errorf("currency pairs is empty") - } - - if err := p.subscribeTickers(cps...); err != nil { - return err - } - if err := p.subscribeCandles(cps...); err != nil { - return err - } - p.setSubscribedPairs(cps...) - telemetryWebsocketSubscribeCurrencyPairs(ProviderGate, len(cps)) - return nil -} - -// subscribeTickers subscribes to the ticker channels for all pairs at once. -func (p *GateProvider) subscribeTickers(cps ...types.CurrencyPair) error { - topics := []string{} - - for _, cp := range cps { - topics = append(topics, currencyPairToGatePair(cp)) - } - - tickerMsg := newGateTickerSubscription(topics...) - if err := p.subscribeTickerPairs(tickerMsg); err != nil { - return err - } - - return nil -} - -// subscribeCandles subscribes to the candle channels for all pairs one-by-one. -// The gate API currently only supports subscribing to one kline market at a time. -// -// REF: https://www.gate.io/docs/websocket/index.html -func (p *GateProvider) subscribeCandles(cps ...types.CurrencyPair) error { - gatePairs := make([]string, len(cps)) - - iterator := 0 - for _, cp := range cps { - gatePairs[iterator] = currencyPairToGatePair(cp) - iterator++ - } - - for _, pair := range gatePairs { - msg := newGateCandleSubscription(pair) - if err := p.subscribeCandlePair(msg); err != nil { - return err - } - } - - return nil -} - -func (p *GateProvider) subscribedPairsToSlice() []types.CurrencyPair { - p.mtx.RLock() - defer p.mtx.RUnlock() - - return types.MapPairsToSlice(p.subscribedPairs) -} - -func (p *GateProvider) getTickerPrice(cp types.CurrencyPair) (types.TickerPrice, error) { - p.mtx.RLock() - defer p.mtx.RUnlock() - - gp := currencyPairToGatePair(cp) - if tickerPair, ok := p.tickers[gp]; ok { - return tickerPair.toTickerPrice() - } - - return types.TickerPrice{}, fmt.Errorf("gate failed to get ticker price for %s", gp) -} - -func (p *GateProvider) handleReceivedTickers(ctx context.Context) { - for { - select { - case <-ctx.Done(): - return - case <-time.After(defaultReadNewWSMessage): - messageType, bz, err := p.wsClient.ReadMessage() - if err != nil { - // if some error occurs continue to try to read the next message. - p.logger.Err(err).Msg("could not read message") - if err := p.ping(); err != nil { - p.logger.Err(err).Msg("could not send ping") - } - continue - } - - if len(bz) == 0 { - continue - } - - p.resetReconnectTimer() - p.messageReceived(messageType, bz) - - case <-p.reconnectTimer.C: // reset by the pongHandler. - if err := p.disconnect(); err != nil { - p.logger.Err(err).Msg("error disconnecting") - } - if err := p.reconnect(); err != nil { - p.logger.Err(err).Msg("error reconnecting") - } - } - } -} - -func (p *GateProvider) messageReceived(messageType int, bz []byte) { - if messageType != websocket.TextMessage { - return - } - - var ( - gateEvent GateEvent - gateErr error - tickerErr error - candleErr error - ) - - gateErr = json.Unmarshal(bz, &gateEvent) - if gateErr == nil { - switch gateEvent.Result.Status { - case "success": - return - case "": - break - default: - if err := p.disconnect(); err != nil { - p.logger.Err(err).Msg("error disconnecting") - } - err := p.reconnect() - if err != nil { - p.logger.Error(). - AnErr("ticker", tickerErr). - AnErr("candle", candleErr). - AnErr("event", err). - Msg("Error on reconnecting") - } - return - } - } - - tickerErr = p.messageReceivedTickerPrice(bz) - if tickerErr == nil { - return - } - - candleErr = p.messageReceivedCandle(bz) - if candleErr == nil { - return - } - - p.logger.Error(). - Int("length", len(bz)). - AnErr("ticker", tickerErr). - AnErr("candle", candleErr). - AnErr("event", gateErr). - Msg("Error on receive message") -} - -// messageReceivedTickerPrice handles the ticker price msg. -// The provider response is a slice with different types at each index. -// -// REF: https://www.gate.io/docs/websocket/index.html -func (p *GateProvider) messageReceivedTickerPrice(bz []byte) error { - var tickerMessage GateTickerResponse - if err := json.Unmarshal(bz, &tickerMessage); err != nil { - return err - } - - if tickerMessage.Method != "ticker.update" { - return fmt.Errorf("message is not a ticker update") - } - - tickerBz, err := json.Marshal(tickerMessage.Params[1]) - if err != nil { - p.logger.Err(err).Msg("could not marshal ticker message") - return err - } - - var gateTicker GateTicker - if err := json.Unmarshal(tickerBz, &gateTicker); err != nil { - p.logger.Err(err).Msg("could not unmarshal ticker message") - return err - } - - symbol, ok := tickerMessage.Params[0].(string) - if !ok { - return fmt.Errorf("symbol should be a string") - } - gateTicker.Symbol = symbol - - p.setTickerPair(gateTicker) - telemetryWebsocketMessage(ProviderGate, MessageTypeTicker) - return nil -} - -// UnmarshalParams is a helper function which unmarshals the 2d slice of interfaces -// from a GateCandleResponse into the GateCandle. -func (candle *GateCandle) UnmarshalParams(params [][]interface{}) error { - var tmp []interface{} - - if len(params) == 0 { - return fmt.Errorf("no candles in response") - } - - // use the most recent candle - tmp = params[len(params)-1] - if len(tmp) != 8 { - return fmt.Errorf("wrong number of fields in candle") - } - - time := int64(tmp[0].(float64)) - if time == 0 { - return fmt.Errorf("time field must be a float") - } - candle.TimeStamp = time - - close, ok := tmp[1].(string) - if !ok { - return fmt.Errorf("close field must be a string") - } - candle.Close = close - - volume, ok := tmp[5].(string) - if !ok { - return fmt.Errorf("volume field must be a string") - } - candle.Volume = volume - - symbol, ok := tmp[7].(string) - if !ok { - return fmt.Errorf("symbol field must be a string") - } - candle.Symbol = symbol - - return nil -} - -// messageReceivedCandle handles the candle price msg. -// The provider response is a slice with different types at each index. -// -// REF: https://www.gate.io/docs/websocket/index.html -func (p *GateProvider) messageReceivedCandle(bz []byte) error { - var candleMessage GateCandleResponse - if err := json.Unmarshal(bz, &candleMessage); err != nil { - return err - } - - if candleMessage.Method != "kline.update" { - return fmt.Errorf("message is not a kline update") - } - - var gateCandle GateCandle - if err := gateCandle.UnmarshalParams(candleMessage.Params); err != nil { - return err - } - - p.setCandlePair(gateCandle) - telemetryWebsocketMessage(ProviderGate, MessageTypeCandle) - return nil -} - -func (p *GateProvider) setTickerPair(ticker GateTicker) { - p.mtx.Lock() - defer p.mtx.Unlock() - p.tickers[ticker.Symbol] = ticker -} - -func (p *GateProvider) setCandlePair(candle GateCandle) { - p.mtx.Lock() - defer p.mtx.Unlock() - // convert gate timestamp seconds -> milliseconds - candle.TimeStamp = SecondsToMilli(candle.TimeStamp) - staleTime := PastUnixTime(providerCandlePeriod) - candleList := []GateCandle{} - - candleList = append(candleList, candle) - for _, c := range p.candles[candle.Symbol] { - if staleTime < c.TimeStamp { - candleList = append(candleList, c) - } - } - p.candles[candle.Symbol] = candleList -} - -// subscribeTickerPairs write the subscription msg to the provider. -func (p *GateProvider) subscribeTickerPairs(msg GateTickerSubscriptionMsg) error { - return p.wsClient.WriteJSON(msg) -} - -// subscribeCandlePair write the subscription msg to the provider. -func (p *GateProvider) subscribeCandlePair(msg GateCandleSubscriptionMsg) error { - return p.wsClient.WriteJSON(msg) -} - -// setSubscribedPairs sets N currency pairs to the map of subscribed pairs. -func (p *GateProvider) setSubscribedPairs(cps ...types.CurrencyPair) { - p.mtx.Lock() - defer p.mtx.Unlock() - - for _, cp := range cps { - p.subscribedPairs[cp.String()] = cp - } -} - -func (p *GateProvider) resetReconnectTimer() { - p.reconnectTimer.Reset(gatePingCheck) -} - -// disconnect disconnects the existing websocket connection. -func (p *GateProvider) disconnect() error { - err := p.wsClient.Close() - if err != nil { - return types.ErrProviderConnection.Wrapf("error closing Gate websocket %v", err) - } - return nil -} - -// reconnect creates a new websocket connection. If there’s a -// network problem, the system will automatically disable the connection. The -// connection will break automatically if the subscription is not established or -// data has not been pushed for more than 30 seconds. To keep the connection stable: -// 1. Set a timer of N seconds whenever a response message is received, where N is -// less than 30. -// 2. If the timer is triggered, which means that no new message is received within -// N seconds, send the String 'ping'. -// 3. Expect a 'pong' as a response. If the response message is not received within -// N seconds, please raise an error or reconnect. -func (p *GateProvider) reconnect() error { - p.logger.Debug().Msg("reconnecting websocket") - wsConn, resp, err := websocket.DefaultDialer.Dial(p.wsURL.String(), nil) - defer resp.Body.Close() - if err != nil { - return fmt.Errorf( - types.ErrWebsocketDial.Error(), - ProviderGate, - err, - ) - } - wsConn.SetPongHandler(p.pongHandler) - p.wsClient = wsConn - - currencyPairs := p.subscribedPairsToSlice() - - telemetryWebsocketReconnect(ProviderGate) - return p.SubscribeCurrencyPairs(currencyPairs...) -} - -// ping to check websocket connection. -func (p *GateProvider) ping() error { - return p.wsClient.WriteMessage(websocket.PingMessage, ping) -} - -func (p *GateProvider) pongHandler(appData string) error { - p.resetReconnectTimer() - return nil -} - -// GetAvailablePairs returns all pairs to which the provider can subscribe. -func (p *GateProvider) GetAvailablePairs() (map[string]struct{}, error) { - resp, err := http.Get(p.endpoints.Rest + gateRestPath) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - var pairsSummary []GatePairSummary - if err := json.NewDecoder(resp.Body).Decode(&pairsSummary); err != nil { - return nil, err - } - - availablePairs := make(map[string]struct{}, len(pairsSummary)) - for _, pair := range pairsSummary { - cp := types.CurrencyPair{ - Base: strings.ToUpper(pair.Base), - Quote: strings.ToUpper(pair.Quote), - } - availablePairs[cp.String()] = struct{}{} - } - - return availablePairs, nil -} - -func (ticker GateTicker) toTickerPrice() (types.TickerPrice, error) { - return types.NewTickerPrice(string(ProviderGate), ticker.Symbol, ticker.Last, ticker.Vol) -} - -func (candle GateCandle) toCandlePrice() (types.CandlePrice, error) { - return types.NewCandlePrice( - string(ProviderGate), - candle.Symbol, - candle.Close, - candle.Volume, - candle.TimeStamp, - ) -} - -// currencyPairToGatePair returns the expected pair for Gate -// ex.: "ATOM_USDT". -func currencyPairToGatePair(pair types.CurrencyPair) string { - return pair.Base + "_" + pair.Quote -} - -// newGateTickerSubscription returns a new subscription topic for tickers. -func newGateTickerSubscription(cp ...string) GateTickerSubscriptionMsg { - return GateTickerSubscriptionMsg{ - Method: "ticker.subscribe", - Params: cp, - ID: 1, - } -} - -// newGateCandleSubscription returns a new subscription topic for candles. -func newGateCandleSubscription(gatePair string) GateCandleSubscriptionMsg { - params := []interface{}{ - gatePair, // currency pair ex. "ATOM_USDT" - 60, // time interval in seconds - } - return GateCandleSubscriptionMsg{ - Method: "kline.subscribe", - Params: params, - ID: 2, - } -} diff --git a/price-feeder/oracle/provider/gate_test.go b/price-feeder/oracle/provider/gate_test.go deleted file mode 100644 index 2d9fccf5d..000000000 --- a/price-feeder/oracle/provider/gate_test.go +++ /dev/null @@ -1,99 +0,0 @@ -package provider - -import ( - "context" - "testing" - - "github.com/CosmosContracts/juno/price-feeder/oracle/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/rs/zerolog" - "github.com/stretchr/testify/require" -) - -func TestGateProvider_GetTickerPrices(t *testing.T) { - p, err := NewGateProvider( - context.TODO(), - zerolog.Nop(), - Endpoint{}, - types.CurrencyPair{Base: "ATOM", Quote: "USDT"}, - ) - require.NoError(t, err) - - t.Run("valid_request_single_ticker", func(t *testing.T) { - lastPrice := "34.69000000" - volume := "2396974.02000000" - - tickerMap := map[string]GateTicker{} - tickerMap["ATOM_USDT"] = GateTicker{ - Symbol: "ATOM_USDT", - Last: lastPrice, - Vol: volume, - } - - p.tickers = tickerMap - - prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "ATOM", Quote: "USDT"}) - require.NoError(t, err) - require.Len(t, prices, 1) - require.Equal(t, sdk.MustNewDecFromStr(lastPrice), prices["ATOMUSDT"].Price) - require.Equal(t, sdk.MustNewDecFromStr(volume), prices["ATOMUSDT"].Volume) - }) - - t.Run("valid_request_multi_ticker", func(t *testing.T) { - lastPriceAtom := "34.69000000" - lastPriceUMEE := "41.35000000" - volume := "2396974.02000000" - - tickerMap := map[string]GateTicker{} - tickerMap["ATOM_USDT"] = GateTicker{ - Symbol: "ATOM_USDT", - Last: lastPriceAtom, - Vol: volume, - } - - tickerMap["UMEE_USDT"] = GateTicker{ - Symbol: "UMEE_USDT", - Last: lastPriceUMEE, - Vol: volume, - } - - p.tickers = tickerMap - prices, err := p.GetTickerPrices( - types.CurrencyPair{Base: "ATOM", Quote: "USDT"}, - types.CurrencyPair{Base: "UMEE", Quote: "USDT"}, - ) - require.NoError(t, err) - require.Len(t, prices, 2) - require.Equal(t, sdk.MustNewDecFromStr(lastPriceAtom), prices["ATOMUSDT"].Price) - require.Equal(t, sdk.MustNewDecFromStr(volume), prices["ATOMUSDT"].Volume) - require.Equal(t, sdk.MustNewDecFromStr(lastPriceUMEE), prices["UMEEUSDT"].Price) - require.Equal(t, sdk.MustNewDecFromStr(volume), prices["UMEEUSDT"].Volume) - }) - - t.Run("invalid_request_invalid_ticker", func(t *testing.T) { - prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "FOO", Quote: "BAR"}) - require.EqualError(t, err, "gate failed to get ticker price for FOO_BAR") - require.Nil(t, prices) - }) -} - -func TestGateProvider_SubscribeCurrencyPairs(t *testing.T) { - p, err := NewGateProvider( - context.TODO(), - zerolog.Nop(), - Endpoint{}, - types.CurrencyPair{Base: "ATOM", Quote: "USDT"}, - ) - require.NoError(t, err) - - t.Run("invalid_subscribe_channels_empty", func(t *testing.T) { - err = p.SubscribeCurrencyPairs([]types.CurrencyPair{}...) - require.ErrorContains(t, err, "currency pairs is empty") - }) -} - -func TestGateCurrencyPairToGatePair(t *testing.T) { - cp := types.CurrencyPair{Base: "ATOM", Quote: "USDT"} - GateSymbol := currencyPairToGatePair(cp) - require.Equal(t, GateSymbol, "ATOM_USDT") -} diff --git a/price-feeder/oracle/provider/huobi.go b/price-feeder/oracle/provider/huobi.go deleted file mode 100644 index 83df1c26b..000000000 --- a/price-feeder/oracle/provider/huobi.go +++ /dev/null @@ -1,528 +0,0 @@ -package provider - -import ( - "bytes" - "compress/gzip" - "context" - "encoding/json" - "fmt" - "io" - "net/http" - "net/url" - "strconv" - "strings" - "sync" - "time" - - "github.com/CosmosContracts/juno/price-feeder/oracle/types" - "github.com/gorilla/websocket" - "github.com/rs/zerolog" -) - -const ( - huobiWSHost = "api-aws.huobi.pro" - huobiWSPath = "/ws" - huobiReconnectTime = time.Minute * 2 - huobiRestHost = "https://api.huobi.pro" - huobiRestPath = "/market/tickers" -) - -var _ Provider = (*HuobiProvider)(nil) - -type ( - // HuobiProvider defines an Oracle provider implemented by the Huobi public - // API. - // - // REF: https://huobiapi.github.io/docs/spot/v1/en/#market-ticker - // REF: https://huobiapi.github.io/docs/spot/v1/en/#get-klines-candles - HuobiProvider struct { - wsURL url.URL - wsClient *websocket.Conn - logger zerolog.Logger - mtx sync.RWMutex - endpoints Endpoint - tickers map[string]HuobiTicker // market.$symbol.ticker => HuobiTicker - candles map[string][]HuobiCandle // market.$symbol.kline.$period => HuobiCandle - subscribedPairs map[string]types.CurrencyPair // Symbol => types.CurrencyPair - } - - // HuobiTicker defines the response type for the channel and the tick object for a - // given ticker/symbol. - HuobiTicker struct { - CH string `json:"ch"` // Channel name. Format:market.$symbol.ticker - Tick HuobiTick `json:"tick"` - } - - // HuobiTick defines the response type for the last 24h market summary and the last - // traded price for a given ticker/symbol. - HuobiTick struct { - Vol float64 `json:"vol"` // Accumulated trading value of last 24 hours - LastPrice float64 `json:"lastPrice"` // Last traded price - } - - // HuobiCandle defines the response type for the channel and the tick object for a - // given ticker/symbol. - HuobiCandle struct { - CH string `json:"ch"` // Channel name. Format:market.$symbol.kline.$period - Tick HuobiCandleTick `json:"tick"` - } - - // HuobiCandleTick defines the response type for the candle. - HuobiCandleTick struct { - Close float64 `json:"close"` // Closing price during this period - TimeStamp int64 `json:"id"` // TimeStamp for this as an ID - Volume float64 `json:"vol"` // Volume during this period - } - - // HuobiSubscriptionMsg Msg to subscribe to one ticker channel at time. - HuobiSubscriptionMsg struct { - Sub string `json:"sub"` // channel to subscribe market.$symbol.ticker - } - - // HuobiPairsSummary defines the response structure for an Huobi pairs - // summary. - HuobiPairsSummary struct { - Data []HuobiPairData `json:"data"` - } - - // HuobiPairData defines the data response structure for an Huobi pair. - HuobiPairData struct { - Symbol string `json:"symbol"` - } -) - -// NewHuobiProvider returns a new Huobi provider with the WS connection and msg handler. -func NewHuobiProvider( - ctx context.Context, - logger zerolog.Logger, - endpoints Endpoint, - pairs ...types.CurrencyPair, -) (*HuobiProvider, error) { - if endpoints.Name != ProviderHuobi { - endpoints = Endpoint{ - Name: ProviderHuobi, - Rest: huobiRestHost, - Websocket: huobiWSHost, - } - } - - wsURL := url.URL{ - Scheme: "wss", - Host: endpoints.Websocket, - Path: huobiWSPath, - } - - wsConn, resp, err := websocket.DefaultDialer.Dial(wsURL.String(), nil) - defer resp.Body.Close() - if err != nil { - return nil, fmt.Errorf( - types.ErrWebsocketDial.Error(), - ProviderHuobi, - err, - ) - } - - provider := &HuobiProvider{ - wsURL: wsURL, - wsClient: wsConn, - logger: logger.With().Str("provider", string(ProviderHuobi)).Logger(), - endpoints: endpoints, - tickers: map[string]HuobiTicker{}, - candles: map[string][]HuobiCandle{}, - subscribedPairs: map[string]types.CurrencyPair{}, - } - - if err := provider.SubscribeCurrencyPairs(pairs...); err != nil { - return nil, err - } - - go provider.handleWebSocketMsgs(ctx) - - return provider, nil -} - -// GetTickerPrices returns the tickerPrices based on the saved map. -func (p *HuobiProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[string]types.TickerPrice, error) { - tickerPrices := make(map[string]types.TickerPrice, len(pairs)) - - for _, cp := range pairs { - price, err := p.getTickerPrice(cp) - if err != nil { - return nil, err - } - tickerPrices[cp.String()] = price - } - - return tickerPrices, nil -} - -// GetTickerPrices returns the tickerPrices based on the saved map. -func (p *HuobiProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[string][]types.CandlePrice, error) { - candlePrices := make(map[string][]types.CandlePrice, len(pairs)) - - for _, cp := range pairs { - price, err := p.getCandlePrices(cp) - if err != nil { - return nil, err - } - candlePrices[cp.String()] = price - } - - return candlePrices, nil -} - -// SubscribeCurrencyPairs subscribe all currency pairs into ticker and candle channels. -func (p *HuobiProvider) SubscribeCurrencyPairs(cps ...types.CurrencyPair) error { - if len(cps) == 0 { - return fmt.Errorf("currency pairs is empty") - } - - if err := p.subscribeChannels(cps...); err != nil { - return err - } - - p.setSubscribedPairs(cps...) - telemetryWebsocketSubscribeCurrencyPairs(ProviderHuobi, len(cps)) - return nil -} - -// subscribeChannels subscribe all currency pairs into ticker and candle channels. -func (p *HuobiProvider) subscribeChannels(cps ...types.CurrencyPair) error { - if err := p.subscribeTickers(cps...); err != nil { - return err - } - - return p.subscribeCandles(cps...) -} - -// subscribeTickers subscribe all currency pairs into ticker channel. -func (p *HuobiProvider) subscribeTickers(cps ...types.CurrencyPair) error { - for _, cp := range cps { - if err := p.subscribeTickerPair(cp); err != nil { - return err - } - } - - return nil -} - -// subscribeCandles subscribe all currency pairs into candle channel. -func (p *HuobiProvider) subscribeCandles(cps ...types.CurrencyPair) error { - for _, cp := range cps { - if err := p.subscribeCandlePair(cp); err != nil { - return err - } - } - - return nil -} - -// subscribedPairsToSlice returns the map of subscribed pairs as slice -func (p *HuobiProvider) subscribedPairsToSlice() []types.CurrencyPair { - p.mtx.RLock() - defer p.mtx.RUnlock() - - return types.MapPairsToSlice(p.subscribedPairs) -} - -func (p *HuobiProvider) handleWebSocketMsgs(ctx context.Context) { - reconnectTicker := time.NewTicker(huobiReconnectTime) - for { - select { - case <-ctx.Done(): - return - case <-time.After(defaultReadNewWSMessage): - messageType, bz, err := p.wsClient.ReadMessage() - if err != nil { - // If some error occurs, check if connection is alive - // and continue to try to read the next message. - p.logger.Err(err).Msg("failed to read message") - if err := p.ping(); err != nil { - p.logger.Err(err).Msg("failed to send ping") - if err := p.disconnect(); err != nil { - p.logger.Err(err).Msg("error disconnecting") - } - if err := p.reconnect(); err != nil { - p.logger.Err(err).Msg("error reconnecting") - } - } - continue - } - - if len(bz) == 0 { - continue - } - - p.messageReceived(messageType, bz, reconnectTicker) - - case <-reconnectTicker.C: - if err := p.disconnect(); err != nil { - p.logger.Err(err).Msg("error disconnecting") - } - if err := p.reconnect(); err != nil { - p.logger.Err(err).Msg("error reconnecting") - } - } - } -} - -// messageReceived handles the received data from the Huobi websocket. All return -// data of websocket Market APIs are compressed with GZIP so they need to be -// decompressed. -func (p *HuobiProvider) messageReceived(messageType int, bz []byte, reconnectTicker *time.Ticker) { - if messageType != websocket.BinaryMessage { - return - } - - bz, err := decompressGzip(bz) - if err != nil { - p.logger.Err(err).Msg("failed to decompress gziped message") - return - } - - if bytes.Contains(bz, ping) { - p.pong(bz, reconnectTicker) - return - } - - var ( - tickerResp HuobiTicker - tickerErr error - candleResp HuobiCandle - candleErr error - ) - - // sometimes the message received is not a ticker or a candle response. - tickerErr = json.Unmarshal(bz, &tickerResp) - if tickerResp.Tick.LastPrice != 0 { - p.setTickerPair(tickerResp) - telemetryWebsocketMessage(ProviderHuobi, MessageTypeTicker) - return - } - - candleErr = json.Unmarshal(bz, &candleResp) - if candleResp.Tick.Close != 0 { - p.setCandlePair(candleResp) - telemetryWebsocketMessage(ProviderHuobi, MessageTypeCandle) - return - } - - p.logger.Error(). - Int("length", len(bz)). - AnErr("ticker", tickerErr). - AnErr("candle", candleErr). - Msg("Error on receive message") -} - -// pong return a heartbeat message when a "ping" is received and reset the -// recconnect ticker because the connection is alive. After connected to Huobi's -// Websocket server, the server will send heartbeat periodically (5s interval). -// When client receives an heartbeat message, it should respond with a matching -// "pong" message which has the same integer in it, e.g. {"ping": 1492420473027} -// and then the return pong message should be {"pong": 1492420473027}. -func (p *HuobiProvider) pong(bz []byte, reconnectTicker *time.Ticker) { - reconnectTicker.Reset(huobiReconnectTime) - var heartbeat struct { - Ping uint64 `json:"ping"` - } - - if err := json.Unmarshal(bz, &heartbeat); err != nil { - p.logger.Err(err).Msg("could not unmarshal heartbeat") - return - } - - if err := p.wsClient.WriteJSON(struct { - Pong uint64 `json:"pong"` - }{Pong: heartbeat.Ping}); err != nil { - p.logger.Err(err).Msg("could not send pong message back") - } -} - -// ping to check websocket connection -func (p *HuobiProvider) ping() error { - return p.wsClient.WriteMessage(websocket.PingMessage, ping) -} - -func (p *HuobiProvider) setTickerPair(ticker HuobiTicker) { - p.mtx.Lock() - defer p.mtx.Unlock() - p.tickers[ticker.CH] = ticker -} - -func (p *HuobiProvider) setCandlePair(candle HuobiCandle) { - p.mtx.Lock() - defer p.mtx.Unlock() - // convert huobi timestamp seconds -> milliseconds - candle.Tick.TimeStamp = SecondsToMilli(candle.Tick.TimeStamp) - staleTime := PastUnixTime(providerCandlePeriod) - candleList := []HuobiCandle{} - candleList = append(candleList, candle) - - for _, c := range p.candles[candle.CH] { - if staleTime < c.Tick.TimeStamp { - candleList = append(candleList, c) - } - } - p.candles[candle.CH] = candleList -} - -// disconnect disconnects the existing websocket connection. -func (p *HuobiProvider) disconnect() error { - err := p.wsClient.Close() - if err != nil { - return types.ErrProviderConnection.Wrapf("error closing Huobi websocket %v", err) - } - return nil -} - -// reconnect creates a new websocket connection. -func (p *HuobiProvider) reconnect() error { - p.logger.Debug().Msg("reconnecting websocket") - wsConn, resp, err := websocket.DefaultDialer.Dial(p.wsURL.String(), nil) - defer resp.Body.Close() - if err != nil { - return fmt.Errorf( - types.ErrWebsocketDial.Error(), - ProviderHuobi, - err, - ) - } - p.wsClient = wsConn - - currencyPairs := p.subscribedPairsToSlice() - - telemetryWebsocketReconnect(ProviderHuobi) - return p.subscribeChannels(currencyPairs...) -} - -// subscribeTickerPair write the subscription ticker msg to the provider. -func (p *HuobiProvider) subscribeTickerPair(cp types.CurrencyPair) error { - huobiSubscriptionMsg := newHuobiTickerSubscriptionMsg(cp) - return p.wsClient.WriteJSON(huobiSubscriptionMsg) -} - -// subscribeCandlePair write the subscription candle msg to the provider. -func (p *HuobiProvider) subscribeCandlePair(cp types.CurrencyPair) error { - huobiSubscriptionCandleMsg := newHuobiCandleSubscriptionMsg(cp) - return p.wsClient.WriteJSON(huobiSubscriptionCandleMsg) -} - -func (p *HuobiProvider) getTickerPrice(cp types.CurrencyPair) (types.TickerPrice, error) { - p.mtx.RLock() - defer p.mtx.RUnlock() - - ticker, ok := p.tickers[currencyPairToHuobiTickerPair(cp)] - if !ok { - return types.TickerPrice{}, fmt.Errorf("huobi failed to get ticker price for %s", cp.String()) - } - - return ticker.toTickerPrice() -} - -func (p *HuobiProvider) getCandlePrices(cp types.CurrencyPair) ([]types.CandlePrice, error) { - p.mtx.RLock() - defer p.mtx.RUnlock() - - candles, ok := p.candles[currencyPairToHuobiCandlePair(cp)] - if !ok { - return []types.CandlePrice{}, fmt.Errorf("failed to get candles price for %s", cp.String()) - } - - candleList := []types.CandlePrice{} - for _, candle := range candles { - cp, err := candle.toCandlePrice() - if err != nil { - return []types.CandlePrice{}, err - } - candleList = append(candleList, cp) - } - return candleList, nil -} - -// setSubscribedPairs sets N currency pairs to the map of subscribed pairs. -func (p *HuobiProvider) setSubscribedPairs(cps ...types.CurrencyPair) { - p.mtx.Lock() - defer p.mtx.Unlock() - - for _, cp := range cps { - p.subscribedPairs[cp.String()] = cp - } -} - -// GetAvailablePairs returns all pairs to which the provider can subscribe. -func (p *HuobiProvider) GetAvailablePairs() (map[string]struct{}, error) { - resp, err := http.Get(p.endpoints.Rest + huobiRestPath) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - var pairsSummary HuobiPairsSummary - if err := json.NewDecoder(resp.Body).Decode(&pairsSummary); err != nil { - return nil, err - } - - availablePairs := make(map[string]struct{}, len(pairsSummary.Data)) - for _, pair := range pairsSummary.Data { - availablePairs[strings.ToUpper(pair.Symbol)] = struct{}{} - } - - return availablePairs, nil -} - -// decompressGzip uncompress gzip compressed messages. All data returned from the -// websocket Market APIs is compressed with GZIP, so it needs to be unzipped. -func decompressGzip(bz []byte) ([]byte, error) { - r, err := gzip.NewReader(bytes.NewReader(bz)) - if err != nil { - return nil, err - } - - return io.ReadAll(r) -} - -// toTickerPrice converts current HuobiTicker to TickerPrice. -func (ticker HuobiTicker) toTickerPrice() (types.TickerPrice, error) { - return types.NewTickerPrice( - string(ProviderHuobi), - ticker.CH, - strconv.FormatFloat(ticker.Tick.LastPrice, 'f', -1, 64), - strconv.FormatFloat(ticker.Tick.Vol, 'f', -1, 64), - ) -} - -func (candle HuobiCandle) toCandlePrice() (types.CandlePrice, error) { - return types.NewCandlePrice( - string(ProviderHuobi), - candle.CH, - strconv.FormatFloat(candle.Tick.Close, 'f', -1, 64), - strconv.FormatFloat(candle.Tick.Volume, 'f', -1, 64), - candle.Tick.TimeStamp, - ) -} - -// newHuobiTickerSubscriptionMsg returns a new ticker subscription Msg. -func newHuobiTickerSubscriptionMsg(cp types.CurrencyPair) HuobiSubscriptionMsg { - return HuobiSubscriptionMsg{ - Sub: currencyPairToHuobiTickerPair(cp), - } -} - -// currencyPairToHuobiTickerPair returns the channel name in the following format: -// "market.$symbol.ticker". -func currencyPairToHuobiTickerPair(cp types.CurrencyPair) string { - return strings.ToLower("market." + cp.String() + ".ticker") -} - -// newHuobiSubscriptionMsg returns a new candle subscription Msg. -func newHuobiCandleSubscriptionMsg(cp types.CurrencyPair) HuobiSubscriptionMsg { - return HuobiSubscriptionMsg{ - Sub: currencyPairToHuobiCandlePair(cp), - } -} - -// currencyPairToHuobiCandlePair returns the channel name in the following format: -// "market.$symbol.line.$period". -func currencyPairToHuobiCandlePair(cp types.CurrencyPair) string { - return strings.ToLower("market." + cp.String() + ".kline.1min") -} diff --git a/price-feeder/oracle/provider/huobi_test.go b/price-feeder/oracle/provider/huobi_test.go deleted file mode 100644 index 8fa114a94..000000000 --- a/price-feeder/oracle/provider/huobi_test.go +++ /dev/null @@ -1,105 +0,0 @@ -package provider - -import ( - "context" - "testing" - - "github.com/CosmosContracts/juno/price-feeder/oracle/types" - "github.com/CosmosContracts/juno/price-feeder/oracle/util" - "github.com/rs/zerolog" - "github.com/stretchr/testify/require" -) - -func TestHuobiProvider_GetTickerPrices(t *testing.T) { - p, err := NewHuobiProvider( - context.TODO(), - zerolog.Nop(), - Endpoint{}, - types.CurrencyPair{Base: "ATOM", Quote: "USDT"}, - ) - require.NoError(t, err) - - t.Run("valid_request_single_ticker", func(t *testing.T) { - lastPrice := 34.69000000 - volume := 2396974.02000000 - - tickerMap := map[string]HuobiTicker{} - tickerMap["market.atomusdt.ticker"] = HuobiTicker{ - CH: "market.atomusdt.ticker", - Tick: HuobiTick{ - LastPrice: lastPrice, - Vol: volume, - }, - } - - p.tickers = tickerMap - - prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "ATOM", Quote: "USDT"}) - require.NoError(t, err) - require.Len(t, prices, 1) - require.Equal(t, util.MustNewDecFromFloat(lastPrice), prices["ATOMUSDT"].Price) - require.Equal(t, util.MustNewDecFromFloat(volume), prices["ATOMUSDT"].Volume) - }) - - t.Run("valid_request_multi_ticker", func(t *testing.T) { - lastPriceAtom := 34.69000000 - lastPriceLuna := 41.35000000 - volume := 2396974.02000000 - - tickerMap := map[string]HuobiTicker{} - tickerMap["market.atomusdt.ticker"] = HuobiTicker{ - CH: "market.atomusdt.ticker", - Tick: HuobiTick{ - LastPrice: lastPriceAtom, - Vol: volume, - }, - } - - tickerMap["market.lunausdt.ticker"] = HuobiTicker{ - CH: "market.lunausdt.ticker", - Tick: HuobiTick{ - LastPrice: lastPriceLuna, - Vol: volume, - }, - } - - p.tickers = tickerMap - prices, err := p.GetTickerPrices( - types.CurrencyPair{Base: "ATOM", Quote: "USDT"}, - types.CurrencyPair{Base: "LUNA", Quote: "USDT"}, - ) - require.NoError(t, err) - require.Len(t, prices, 2) - require.Equal(t, util.MustNewDecFromFloat(lastPriceAtom), prices["ATOMUSDT"].Price) - require.Equal(t, util.MustNewDecFromFloat(volume), prices["ATOMUSDT"].Volume) - require.Equal(t, util.MustNewDecFromFloat(lastPriceLuna), prices["LUNAUSDT"].Price) - require.Equal(t, util.MustNewDecFromFloat(volume), prices["LUNAUSDT"].Volume) - }) - - t.Run("invalid_request_invalid_ticker", func(t *testing.T) { - prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "FOO", Quote: "BAR"}) - require.EqualError(t, err, "huobi failed to get ticker price for FOOBAR") - require.Nil(t, prices) - }) -} - -func TestHuobiProvider_SubscribeCurrencyPairs(t *testing.T) { - p, err := NewHuobiProvider( - context.TODO(), - zerolog.Nop(), - Endpoint{}, - types.CurrencyPair{Base: "ATOM", Quote: "USDT"}, - ) - require.NoError(t, err) - - t.Run("invalid_subscribe_channels_empty", func(t *testing.T) { - err = p.SubscribeCurrencyPairs([]types.CurrencyPair{}...) - require.ErrorContains(t, err, "currency pairs is empty") - }) -} - -func TestHuobiCurrencyPairToHuobiPair(t *testing.T) { - cp := types.CurrencyPair{Base: "ATOM", Quote: "USDT"} - binanceSymbol := currencyPairToHuobiTickerPair(cp) - require.Equal(t, binanceSymbol, "market.atomusdt.ticker") -} diff --git a/price-feeder/oracle/provider/juno.go b/price-feeder/oracle/provider/juno.go deleted file mode 100644 index 9673d84e7..000000000 --- a/price-feeder/oracle/provider/juno.go +++ /dev/null @@ -1,228 +0,0 @@ -package provider - -import ( - "encoding/json" - "fmt" - "io" - "net/http" - "reflect" - "strings" - - "github.com/CosmosContracts/juno/price-feeder/oracle/types" - "github.com/CosmosContracts/juno/price-feeder/oracle/util" -) - -const ( - junoRestURL = "https://api-junoswap.enigma-validator.com" - junoPriceTokenEndpoint = "/prices/tokens" - junoVolumeTokenEndpoint = "/volumes/tokens" - junoCandleEndpoint = "/prices/tokens/historical" - junoPairsEndpoint = "/summary/pairs" -) - -var _ Provider = (*JunoProvider)(nil) - -type ( - // JunoProvider defines an Oracle provider implemented by the Juno public - // API. - // - // REF: https://api-junoswap.enigma-validator.com/swagger/#/ - JunoProvider struct { - baseURL string - client *http.Client - } - - // JunoTokenPriceResponse defines the response structure of price for an Juno token - // request. - JunoTokenPriceResponse struct { - Price float64 `json:"price"` - } - - // JunoTokenVolumnResponse defines the response structure of volume for an Juno token - // request. - JunoTokenVolumnResponse struct { - Volume float64 `json:"volumes"` - } - - // JunoTokenInfo defines the response structure of information of an Juno token - // request. - JunoTokenInfo struct { - JunoTokenPriceResponse - Symbol string - Volume float64 - } - - // JunoPairData defines the data response structure for an Juno pair. - JunoPairData struct { - Base string `json:"base"` - Quote string `json:"target"` - } -) - -func NewJunoProvider(endpoint Endpoint) *JunoProvider { - if endpoint.Name == ProviderJuno { - return &JunoProvider{ - baseURL: endpoint.Rest, - client: newDefaultHTTPClient(), - } - } - return &JunoProvider{ - baseURL: junoRestURL, - client: newDefaultHTTPClient(), - } -} - -func (p JunoProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[string]types.TickerPrice, error) { - var junoTokenInfo []JunoTokenInfo - // Get price and symbol of tokens - pathPriceToken := fmt.Sprintf("%s%s/current", p.baseURL, junoPriceTokenEndpoint) - resp, err := p.client.Get(pathPriceToken) - if err != nil { - return nil, fmt.Errorf("failed to make Juno request: %w", err) - } - err = checkHTTPStatus(resp) - if err != nil { - return nil, err - } - - defer resp.Body.Close() - - bz, err := io.ReadAll(resp.Body) - if err != nil { - return nil, fmt.Errorf("failed to read Juno response body: %w", err) - } - var tokensResps map[string]interface{} - if err := json.Unmarshal(bz, &tokensResps); err != nil { - return nil, fmt.Errorf("failed to unmarshal Juno response body: %w", err) - } - - listSymbol := reflect.ValueOf(tokensResps).MapKeys() - - // Get symbol and price of Tokens - for _, symbol := range listSymbol { - tokenInfo, err := getSymbolAndPriceToken(symbol, tokensResps) - if err != nil { - return nil, fmt.Errorf("failed to unmarshal Juno response body: %w", err) - } - junoTokenInfo = append(junoTokenInfo, tokenInfo) - } - - // Get volume of tokens - for id, symbol := range listSymbol { - path := fmt.Sprintf("%s%s/%s/current", p.baseURL, junoVolumeTokenEndpoint, symbol) - resp, err = p.client.Get(path) - if err != nil { - return nil, fmt.Errorf("failed to make Juno request: %w", err) - } - err = checkHTTPStatus(resp) - if err != nil { - return nil, err - } - - defer resp.Body.Close() - - bz, err = io.ReadAll(resp.Body) - if err != nil { - return nil, fmt.Errorf("failed to read Juno response body: %w", err) - } - var tokensResp JunoTokenVolumnResponse - if err := json.Unmarshal(bz, &tokensResp); err != nil { - return nil, fmt.Errorf("failed to unmarshal Juno response body: %w", err) - } - junoTokenInfo[id].Volume = tokensResp.Volume - } - - baseDenomIdx := make(map[string]types.CurrencyPair) - for _, cp := range pairs { - baseDenomIdx[strings.ToUpper(cp.Base)] = cp - } - - tickerPrices := make(map[string]types.TickerPrice, len(pairs)) - for _, tr := range junoTokenInfo { - symbol := strings.ToUpper(tr.Symbol) // symbol == base in a currency pair - - cp, ok := baseDenomIdx[symbol] - if !ok { - // skip tokens that are not requested - continue - } - - if _, ok := tickerPrices[symbol]; ok { - return nil, fmt.Errorf("duplicate token found in Juno response: %s", symbol) - } - - price, err := util.NewDecFromFloat(tr.Price) - if err != nil { - return nil, fmt.Errorf("failed to read Juno price (%f) for %s", tr.Price, symbol) - } - - volume, err := util.NewDecFromFloat(tr.Volume) - if err != nil { - return nil, fmt.Errorf("failed to read Juno volume (%f) for %s", tr.Volume, symbol) - } - tickerPrices[cp.String()] = types.TickerPrice{Price: price, Volume: volume} - } - - for _, cp := range pairs { - if _, ok := tickerPrices[cp.String()]; !ok { - return nil, fmt.Errorf(types.ErrMissingExchangeRate.Error(), cp.String()) - } - } - - return tickerPrices, nil -} - -func (p JunoProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[string][]types.CandlePrice, error) { - return nil, nil -} - -func (p JunoProvider) GetAvailablePairs() (map[string]struct{}, error) { - path := fmt.Sprintf("%s%s", p.baseURL, junoPairsEndpoint) - resp, err := p.client.Get(path) - if err != nil { - return nil, err - } - - err = checkHTTPStatus(resp) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - body, _ := io.ReadAll(resp.Body) - - var pairsSummary []JunoPairData - if err := json.Unmarshal(body, &pairsSummary); err != nil { - return nil, err - } - - availablePairs := make(map[string]struct{}, len(pairsSummary)) - for _, pair := range pairsSummary { - cp := types.CurrencyPair{ - Base: strings.ToUpper(pair.Base), - Quote: strings.ToUpper(pair.Quote), - } - availablePairs[cp.String()] = struct{}{} - } - - return availablePairs, nil -} - -// SubscribeCurrencyPairs performs a no-op since juno does not use websockets -func (p JunoProvider) SubscribeCurrencyPairs(pairs ...types.CurrencyPair) error { - return nil -} - -// Get symbol and price of token -func getSymbolAndPriceToken(symbol reflect.Value, tokensResps map[string]interface{}) (tokenInfo JunoTokenInfo, err error) { - var tokenPrice JunoTokenPriceResponse - tokenInfo.Symbol = symbol.String() - dataOfToken := tokensResps[tokenInfo.Symbol] - body, _ := json.Marshal(dataOfToken) - if err := json.Unmarshal(body, &tokenPrice); err != nil { - return tokenInfo, fmt.Errorf("failed to unmarshal Juno response body: %w", err) - } - tokenInfo.Price = tokenPrice.Price - - return tokenInfo, nil -} diff --git a/price-feeder/oracle/provider/juno_test.go b/price-feeder/oracle/provider/juno_test.go deleted file mode 100644 index f023d46fa..000000000 --- a/price-feeder/oracle/provider/juno_test.go +++ /dev/null @@ -1,247 +0,0 @@ -package provider - -import ( - "net/http" - "net/http/httptest" - "testing" - - "github.com/CosmosContracts/juno/price-feeder/oracle/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" -) - -func TestJunoProvider_GetTickerPrices(t *testing.T) { - p := NewJunoProvider(Endpoint{}) - - t.Run("valid_request_single_ticker", func(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { - var resp string - if req.URL.String() == "/prices/tokens/current" { //nolint:goconst,gocritic - //nolint:goconst - resp = `{ - "JUNO": { - "date": "2022-11-02 18:57:36", - "price": 2.93, - "denom": "ujuno" - }, - "AKT": { - "date": "2022-11-02 18:57:36", - "price": 0.26169002, - "denom": "ibc/DFC6F33796D5D0075C5FB54A4D7B8E76915ACF434CB1EE2A1BA0BB8334E17C3A" - }, - "ARTO": { - "date": "2022-11-02 18:57:36", - "price": 0.08182318000000001, - "denom": "arto" - } - } - ` - } else if req.URL.String() == "/volumes/tokens/JUNO/current" { //nolint:goconst - resp = ` - { - "date": "2022-11-07", - "volumes": 51 - } - ` - } else if req.URL.String() == "/volumes/tokens/AKT/current" { //nolint:goconst - resp = ` - { - "date": "2022-11-07", - "volumes": 500 - } - ` - } else if req.URL.String() == "/volumes/tokens/ARTO/current" { //nolint:goconst - resp = ` - { - "date": "2022-11-07", - "volumes": 500 - } - ` - } - rw.Write([]byte(resp)) //nolint:errcheck - })) - defer server.Close() - - p.client = server.Client() - p.baseURL = server.URL - - prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "JUNO", Quote: "USDT"}) - require.NoError(t, err) - require.Len(t, prices, 1) - require.Equal(t, sdk.MustNewDecFromStr("2.93"), prices["JUNOUSDT"].Price) - require.Equal(t, sdk.MustNewDecFromStr("51"), prices["JUNOUSDT"].Volume) - }) - - t.Run("valid_request_multi_ticker", func(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { - println("check req: ", req.URL.String()) - var resp string - if req.URL.String() == "/prices/tokens/current" { //nolint:gocritic - resp = `{ - "JUNO": { - "date": "2022-11-02 18:57:36", - "price": 2.93, - "denom": "ujuno" - }, - "AKT": { - "date": "2022-11-02 18:57:36", - "price": 0.26169002, - "denom": "ibc/DFC6F33796D5D0075C5FB54A4D7B8E76915ACF434CB1EE2A1BA0BB8334E17C3A" - }, - "ARTO": { - "date": "2022-11-02 18:57:36", - "price": 0.08182318000000001, - "denom": "arto" - } - } - ` - } else if req.URL.String() == "/volumes/tokens/JUNO/current" { - //nolint:goconst - resp = ` - { - "date": "2022-11-07", - "volumes": 5 - } - ` - } else if req.URL.String() == "/volumes/tokens/AKT/current" { - //nolint:goconst - resp = ` - { - "date": "2022-11-07", - "volumes": 5 - } - ` - } else if req.URL.String() == "/volumes/tokens/ARTO/current" { //nolint:goconst - resp = ` - { - "date": "2022-11-07", - "volumes": 0 - } - ` - } - rw.Write([]byte(resp)) //nolint:errcheck - })) - defer server.Close() - - p.client = server.Client() - p.baseURL = server.URL - - prices, err := p.GetTickerPrices( - types.CurrencyPair{Base: "JUNO", Quote: "USDT"}, - types.CurrencyPair{Base: "AKT", Quote: "USDT"}, - ) - require.NoError(t, err) - require.Len(t, prices, 2) - require.Equal(t, sdk.MustNewDecFromStr("2.93"), prices["JUNOUSDT"].Price) - require.Equal(t, sdk.MustNewDecFromStr("5"), prices["JUNOUSDT"].Volume) - require.Equal(t, sdk.MustNewDecFromStr("0.26169002"), prices["AKTUSDT"].Price) - require.Equal(t, sdk.MustNewDecFromStr("5"), prices["AKTUSDT"].Volume) - }) - - t.Run("invalid_request_bad_response", func(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { - rw.Write([]byte(`FOO`)) //nolint:errcheck - })) - defer server.Close() - - p.client = server.Client() - p.baseURL = server.URL - - prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "JUNO", Quote: "USDT"}) - require.Error(t, err) - require.Nil(t, prices) - }) - - t.Run("invalid_request_invalid_ticker", func(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { - println("check req: ", req.URL.String()) - var resp string - if req.URL.String() == "/prices/tokens/current" { //nolint:gocritic - resp = `{ - "JUNO": { - "date": "2022-11-02 18:57:36", - "price": 2.93, - "denom": "ujuno" - }, - "AKT": { - "date": "2022-11-02 18:57:36", - "price": 0.26169002, - "denom": "ibc/DFC6F33796D5D0075C5FB54A4D7B8E76915ACF434CB1EE2A1BA0BB8334E17C3A" - }, - "ARTO": { - "date": "2022-11-02 18:57:36", - "price": 0.08182318000000001, - "denom": "arto" - } - } - ` - } else if req.URL.String() == "/volumes/tokens/JUNO/current" { - resp = ` - { - "date": "2022-11-07", - "volumes": 5 - } - ` - } else if req.URL.String() == "/volumes/tokens/AKT/current" { - resp = ` - { - "date": "2022-11-07", - "volumes": 0 - } - ` - } else if req.URL.String() == "/volumes/tokens/ARTO/current" { - resp = ` - { - "date": "2022-11-07", - "volumes": 0 - } - ` - } - rw.Write([]byte(resp)) //nolint:errcheck - })) - defer server.Close() - - p.client = server.Client() - p.baseURL = server.URL - - prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "FOO", Quote: "BAR"}) - require.Error(t, err) - require.Nil(t, prices) - }) -} - -func TestJunoProvider_GetAvailablePairs(t *testing.T) { - p := NewJunoProvider(Endpoint{}) - _, err := p.GetAvailablePairs() - require.NoError(t, err) - - t.Run("valid_available_pair", func(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { - require.Equal(t, "/summary/pairs", req.URL.String()) - resp := `[ - { - "base": "JUNO", - "target": "USDC" - }, - { - "base": "JUNO", - "target": "ATOM" - } - ]` - rw.Write([]byte(resp)) //nolint:errcheck - })) - defer server.Close() - - p.client = server.Client() - p.baseURL = server.URL - - availablePairs, err := p.GetAvailablePairs() - require.Nil(t, err) - - _, exist := availablePairs["JUNOUSDC"] - require.True(t, exist) - - _, exist = availablePairs["JUNOATOM"] - require.True(t, exist) - }) -} diff --git a/price-feeder/oracle/provider/kraken.go b/price-feeder/oracle/provider/kraken.go deleted file mode 100644 index 6bed58753..000000000 --- a/price-feeder/oracle/provider/kraken.go +++ /dev/null @@ -1,665 +0,0 @@ -package provider - -import ( - "context" - "encoding/json" - "fmt" - "net/http" - "net/url" - "strconv" - "strings" - "sync" - "time" - - "github.com/CosmosContracts/juno/price-feeder/oracle/types" - "github.com/gorilla/websocket" - "github.com/rs/zerolog" -) - -const ( - krakenWSHost = "ws.kraken.com" - KrakenRestHost = "https://api.kraken.com" - KrakenRestPath = "/0/public/AssetPairs" - krakenEventSystemStatus = "systemStatus" - krakenEventSubscriptionStatus = "subscriptionStatus" -) - -var _ Provider = (*KrakenProvider)(nil) - -type ( - // KrakenProvider defines an Oracle provider implemented by the Kraken public - // API. - // - // REF: https://docs.kraken.com/websockets/#overview - KrakenProvider struct { - wsURL url.URL - wsClient *websocket.Conn - logger zerolog.Logger - mtx sync.RWMutex - endpoints Endpoint - tickers map[string]types.TickerPrice // Symbol => TickerPrice - candles map[string][]KrakenCandle // Symbol => KrakenCandle - subscribedPairs map[string]types.CurrencyPair // Symbol => types.CurrencyPair - } - - // KrakenTicker ticker price response from Kraken ticker channel. - // REF: https://docs.kraken.com/websockets/#message-ticker - KrakenTicker struct { - C []string `json:"c"` // Close with Price in the first position - V []string `json:"v"` // Volume with the value over last 24 hours in the second position - } - - // KrakenCandle candle response from Kraken candle channel. - // REF: https://docs.kraken.com/websockets/#message-ohlc - KrakenCandle struct { - Close string // Close price during this period - TimeStamp int64 // Linux epoch timestamp - Volume string // Volume during this period - Symbol string // Symbol for this candle - } - - // KrakenSubscriptionMsg Msg to subscribe to all the pairs at once. - KrakenSubscriptionMsg struct { - Event string `json:"event"` // subscribe/unsubscribe - Pair []string `json:"pair"` // Array of currency pairs ex.: "BTC/USDT", - Subscription KrakenSubscriptionChannel `json:"subscription"` // subscription object - } - - // KrakenSubscriptionChannel Msg with the channel name to be subscribed. - KrakenSubscriptionChannel struct { - Name string `json:"name"` // channel to be subscribed ex.: ticker - } - - // KrakenEvent wraps the possible events from the provider. - KrakenEvent struct { - Event string `json:"event"` // events from kraken ex.: systemStatus | subscriptionStatus - } - - // KrakenEventSystemStatus parse the systemStatus event message. - KrakenEventSystemStatus struct { - Status string `json:"status"` // online|maintenance|cancel_only|limit_only|post_only - } - - // KrakenEventSubscriptionStatus parse the subscriptionStatus event message. - KrakenEventSubscriptionStatus struct { - Status string `json:"status"` // subscribed|unsubscribed|error - Pair string `json:"pair"` // Pair symbol base/quote ex.: "XBT/USD" - ErrorMessage string `json:"errorMessage"` // error description - } - - // KrakenPairsSummary defines the response structure for an Kraken pairs summary. - KrakenPairsSummary struct { - Result map[string]KrakenPairData `json:"result"` - } - - // KrakenPairData defines the data response structure for an Kraken pair. - KrakenPairData struct { - WsName string `json:"wsname"` - } -) - -// NewKrakenProvider returns a new Kraken provider with the WS connection and msg handler. -func NewKrakenProvider( - ctx context.Context, - logger zerolog.Logger, - endpoints Endpoint, - pairs ...types.CurrencyPair, -) (*KrakenProvider, error) { - if endpoints.Name != ProviderKraken { - endpoints = Endpoint{ - Name: ProviderKraken, - Rest: KrakenRestHost, - Websocket: krakenWSHost, - } - } - - wsURL := url.URL{ - Scheme: "wss", - Host: endpoints.Websocket, - } - - wsConn, resp, err := websocket.DefaultDialer.Dial(wsURL.String(), nil) - defer resp.Body.Close() - if err != nil { - return nil, fmt.Errorf( - types.ErrWebsocketDial.Error(), - ProviderKraken, - err, - ) - } - - provider := &KrakenProvider{ - wsURL: wsURL, - wsClient: wsConn, - logger: logger.With().Str("provider", string(ProviderKraken)).Logger(), - endpoints: endpoints, - tickers: map[string]types.TickerPrice{}, - candles: map[string][]KrakenCandle{}, - subscribedPairs: map[string]types.CurrencyPair{}, - } - - if err := provider.SubscribeCurrencyPairs(pairs...); err != nil { - return nil, err - } - - go provider.handleWebSocketMsgs(ctx) - - return provider, nil -} - -// GetTickerPrices returns the tickerPrices based on the saved map. -func (p *KrakenProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[string]types.TickerPrice, error) { - p.mtx.RLock() - defer p.mtx.RUnlock() - - tickerPrices := make(map[string]types.TickerPrice, len(pairs)) - - for _, cp := range pairs { - key := cp.String() - tickerPrice, ok := p.tickers[key] - if !ok { - return nil, fmt.Errorf("kraken failed to get ticker price for %s", key) - } - tickerPrices[key] = tickerPrice - } - - return tickerPrices, nil -} - -// GetCandlePrices returns the candlePrices based on the saved map. -func (p *KrakenProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[string][]types.CandlePrice, error) { - candlePrices := make(map[string][]types.CandlePrice, len(pairs)) - - for _, cp := range pairs { - key := cp.String() - candlePrice, err := p.getCandlePrices(key) - if err != nil { - return nil, err - } - candlePrices[key] = candlePrice - } - - return candlePrices, nil -} - -// SubscribeCurrencyPairs subscribe all currency pairs into ticker and candle channels. -func (p *KrakenProvider) SubscribeCurrencyPairs(cps ...types.CurrencyPair) error { - if len(cps) == 0 { - return fmt.Errorf("currency pairs is empty") - } - - if err := p.subscribeChannels(cps...); err != nil { - return err - } - - p.setSubscribedPairs(cps...) - telemetryWebsocketSubscribeCurrencyPairs(ProviderKraken, len(cps)) - return nil -} - -// subscribeChannels subscribe all currency pairs into ticker and candle channels. -func (p *KrakenProvider) subscribeChannels(cps ...types.CurrencyPair) error { - pairs := make([]string, len(cps)) - - for i, cp := range cps { - pairs[i] = currencyPairToKrakenPair(cp) - } - - if err := p.subscribeTickers(pairs...); err != nil { - return err - } - - return p.subscribeCandles(pairs...) -} - -// subscribedPairsToSlice returns the map of subscribed pairs as slice -func (p *KrakenProvider) subscribedPairsToSlice() []types.CurrencyPair { - p.mtx.RLock() - defer p.mtx.RUnlock() - - return types.MapPairsToSlice(p.subscribedPairs) -} - -func (candle KrakenCandle) toCandlePrice() (types.CandlePrice, error) { - return types.NewCandlePrice( - string(ProviderKraken), - candle.Symbol, - candle.Close, - candle.Volume, - candle.TimeStamp, - ) -} - -func (p *KrakenProvider) getCandlePrices(key string) ([]types.CandlePrice, error) { - p.mtx.RLock() - defer p.mtx.RUnlock() - - candles, ok := p.candles[key] - if !ok { - return []types.CandlePrice{}, fmt.Errorf("kraken failed to get candle prices for %s", key) - } - - candleList := []types.CandlePrice{} - for _, candle := range candles { - cp, err := candle.toCandlePrice() - if err != nil { - return []types.CandlePrice{}, err - } - candleList = append(candleList, cp) - } - return candleList, nil -} - -// handleWebSocketMsgs receive all the messages from the provider and controls the -// reconnect function to the web socket. -func (p *KrakenProvider) handleWebSocketMsgs(ctx context.Context) { - reconnectTicker := time.NewTicker(defaultMaxConnectionTime) - defer reconnectTicker.Stop() - - for { - select { - case <-ctx.Done(): - return - case <-time.After(defaultReadNewWSMessage): - messageType, bz, err := p.wsClient.ReadMessage() - if err != nil { - if websocket.IsCloseError(err, websocket.CloseAbnormalClosure) { - p.logger.Err(err).Msg("WebSocket closed unexpectedly") - continue - } - - // if some error occurs continue to try to read the next message. - p.logger.Err(err).Msg("could not read message") - if err := p.ping(); err != nil { - p.logger.Err(err).Msg("failed to send ping") - } - continue - } - - if len(bz) == 0 { - continue - } - - p.messageReceived(messageType, bz) - - case <-reconnectTicker.C: - if err := p.reconnect(); err != nil { - p.logger.Err(err).Msg("error reconnecting") - } - } - } -} - -// messageReceived handles any message sent by the provider. -func (p *KrakenProvider) messageReceived(messageType int, bz []byte) { - if messageType != websocket.TextMessage { - return - } - - var ( - krakenEvent KrakenEvent - krakenErr error - tickerErr error - candleErr error - ) - - krakenErr = json.Unmarshal(bz, &krakenEvent) - if krakenErr == nil { - switch krakenEvent.Event { - case krakenEventSystemStatus: - p.messageReceivedSystemStatus(bz) - return - case krakenEventSubscriptionStatus: - p.messageReceivedSubscriptionStatus(bz) - return - } - return - } - - tickerErr = p.messageReceivedTickerPrice(bz) - if tickerErr == nil { - return - } - - candleErr = p.messageReceivedCandle(bz) - if candleErr == nil { - return - } - - p.logger.Error(). - Int("length", len(bz)). - AnErr("ticker", tickerErr). - AnErr("candle", candleErr). - AnErr("event", krakenErr). - Msg("Error on receive message") -} - -// messageReceivedTickerPrice handles the ticker price msg. -func (p *KrakenProvider) messageReceivedTickerPrice(bz []byte) error { - // the provider response is an array with different types at each index - // kraken documentation https://docs.kraken.com/websockets/#message-ticker - var tickerMessage []interface{} - if err := json.Unmarshal(bz, &tickerMessage); err != nil { - return err - } - - if len(tickerMessage) != 4 { - return fmt.Errorf("received an unexpected structure") - } - - channelName, ok := tickerMessage[2].(string) - if !ok || channelName != "ticker" { - return fmt.Errorf("received an unexpected channel name") - } - - tickerBz, err := json.Marshal(tickerMessage[1]) - if err != nil { - p.logger.Err(err).Msg("could not marshal ticker message") - return err - } - - var krakenTicker KrakenTicker - if err := json.Unmarshal(tickerBz, &krakenTicker); err != nil { - p.logger.Err(err).Msg("could not unmarshal ticker message") - return err - } - - krakenPair, ok := tickerMessage[3].(string) - if !ok { - p.logger.Debug().Msg("received an unexpected pair") - return err - } - - krakenPair = normalizeKrakenBTCPair(krakenPair) - currencyPairSymbol := krakenPairToCurrencyPairSymbol(krakenPair) - - tickerPrice, err := krakenTicker.toTickerPrice(currencyPairSymbol) - if err != nil { - p.logger.Err(err).Msg("could not parse kraken ticker to ticker price") - return err - } - - p.setTickerPair(currencyPairSymbol, tickerPrice) - telemetryWebsocketMessage(ProviderKraken, MessageTypeTicker) - return nil -} - -func (candle *KrakenCandle) UnmarshalJSON(buf []byte) error { - var tmp []interface{} - if err := json.Unmarshal(buf, &tmp); err != nil { - return err - } - if len(tmp) != 9 { - return fmt.Errorf("wrong number of fields in candle") - } - - // timestamps come as a float string - time, ok := tmp[1].(string) - if !ok { - return fmt.Errorf("time field must be a string") - } - timeFloat, err := strconv.ParseFloat(time, 64) - if err != nil { - return fmt.Errorf("unable to convert time to float") - } - candle.TimeStamp = int64(timeFloat) - - close, ok := tmp[5].(string) - if !ok { - return fmt.Errorf("close field must be a string") - } - candle.Close = close - - volume, ok := tmp[7].(string) - if !ok { - return fmt.Errorf("volume field must be a string") - } - candle.Volume = volume - - return nil -} - -// messageReceivedCandle handles the candle msg. -func (p *KrakenProvider) messageReceivedCandle(bz []byte) error { - // the provider response is an array with different types at each index - // kraken documentation https://docs.kraken.com/websockets/#message-ohlc - var candleMessage []interface{} - if err := json.Unmarshal(bz, &candleMessage); err != nil { - return err - } - - if len(candleMessage) != 4 { - return fmt.Errorf("received something different than candle") - } - - channelName, ok := candleMessage[2].(string) - if !ok || channelName != "ohlc-1" { - return fmt.Errorf("received an unexpected channel name") - } - - tickerBz, err := json.Marshal(candleMessage[1]) - if err != nil { - return fmt.Errorf("could not marshal candle message") - } - - var krakenCandle KrakenCandle - if err := krakenCandle.UnmarshalJSON(tickerBz); err != nil { - return err - } - - krakenPair, ok := candleMessage[3].(string) - if !ok { - return fmt.Errorf("received an unexpected pair") - } - - krakenPair = normalizeKrakenBTCPair(krakenPair) - currencyPairSymbol := krakenPairToCurrencyPairSymbol(krakenPair) - krakenCandle.Symbol = currencyPairSymbol - - telemetryWebsocketMessage(ProviderKraken, MessageTypeCandle) - p.setCandlePair(krakenCandle) - return nil -} - -// reconnect closes the last WS connection then create a new one. -func (p *KrakenProvider) reconnect() error { - err := p.wsClient.Close() - if err != nil { - p.logger.Err(err).Msg("error closing Kraken websocket") - } - - p.logger.Debug().Msg("trying to reconnect") - wsConn, resp, err := websocket.DefaultDialer.Dial(p.wsURL.String(), nil) - defer resp.Body.Close() - if err != nil { - return fmt.Errorf( - types.ErrWebsocketDial.Error(), - ProviderKraken, - err, - ) - } - p.wsClient = wsConn - telemetryWebsocketReconnect(ProviderKraken) - - return p.subscribeChannels(p.subscribedPairsToSlice()...) -} - -// messageReceivedSubscriptionStatus handle the subscription status message -// sent by the provider. -func (p *KrakenProvider) messageReceivedSubscriptionStatus(bz []byte) { - var subscriptionStatus KrakenEventSubscriptionStatus - if err := json.Unmarshal(bz, &subscriptionStatus); err != nil { - p.logger.Err(err).Msg("provider could not unmarshal KrakenEventSubscriptionStatus") - return - } - - switch subscriptionStatus.Status { - case "error": - p.logger.Error().Msg(subscriptionStatus.ErrorMessage) - p.removeSubscribedTickers(krakenPairToCurrencyPairSymbol(subscriptionStatus.Pair)) - return - case "unsubscribed": - p.logger.Debug().Msgf("ticker %s was unsubscribed", subscriptionStatus.Pair) - p.removeSubscribedTickers(krakenPairToCurrencyPairSymbol(subscriptionStatus.Pair)) - return - } -} - -// messageReceivedSystemStatus handle the system status and try to reconnect if it -// is not online. -func (p *KrakenProvider) messageReceivedSystemStatus(bz []byte) { - var systemStatus KrakenEventSystemStatus - if err := json.Unmarshal(bz, &systemStatus); err != nil { - p.logger.Err(err).Msg("could not unmarshal event system status") - return - } - - if strings.EqualFold(systemStatus.Status, "online") { - return - } - - if err := p.reconnect(); err != nil { - p.logger.Err(err).Msg("error reconnecting") - } -} - -// setTickerPair sets an ticker to the map thread safe by the mutex. -func (p *KrakenProvider) setTickerPair(symbol string, ticker types.TickerPrice) { - p.mtx.Lock() - defer p.mtx.Unlock() - p.tickers[symbol] = ticker -} - -func (p *KrakenProvider) setCandlePair(candle KrakenCandle) { - p.mtx.Lock() - defer p.mtx.Unlock() - // convert kraken timestamp seconds -> milliseconds - candle.TimeStamp = SecondsToMilli(candle.TimeStamp) - staleTime := PastUnixTime(providerCandlePeriod) - candleList := []KrakenCandle{} - - candleList = append(candleList, candle) - for _, c := range p.candles[candle.Symbol] { - if staleTime < c.TimeStamp { - candleList = append(candleList, c) - } - } - p.candles[candle.Symbol] = candleList -} - -// ping to check websocket connection. -func (p *KrakenProvider) ping() error { - return p.wsClient.WriteMessage(websocket.PingMessage, ping) -} - -// subscribeTickers write the subscription msg to the provider. -func (p *KrakenProvider) subscribeTickers(pairs ...string) error { - subsMsg := newKrakenTickerSubscriptionMsg(pairs...) - return p.wsClient.WriteJSON(subsMsg) -} - -// subscribeCandles write the subscription msg to the provider. -func (p *KrakenProvider) subscribeCandles(pairs ...string) error { - subsMsg := newKrakenCandleSubscriptionMsg(pairs...) - return p.wsClient.WriteJSON(subsMsg) -} - -// setSubscribedPairs sets N currency pairs to the map of subscribed pairs. -func (p *KrakenProvider) setSubscribedPairs(cps ...types.CurrencyPair) { - p.mtx.Lock() - defer p.mtx.Unlock() - - for _, cp := range cps { - p.subscribedPairs[cp.String()] = cp - } -} - -// removeSubscribedTickers delete N pairs from the subscribed map. -func (p *KrakenProvider) removeSubscribedTickers(tickerSymbols ...string) { - p.mtx.Lock() - defer p.mtx.Unlock() - - for _, tickerSymbol := range tickerSymbols { - delete(p.subscribedPairs, tickerSymbol) - } -} - -// GetAvailablePairs returns all pairs to which the provider can subscribe. -func (p *KrakenProvider) GetAvailablePairs() (map[string]struct{}, error) { - resp, err := http.Get(p.endpoints.Rest + KrakenRestPath) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - var pairsSummary KrakenPairsSummary - if err := json.NewDecoder(resp.Body).Decode(&pairsSummary); err != nil { - return nil, err - } - - availablePairs := make(map[string]struct{}, len(pairsSummary.Result)) - for _, pair := range pairsSummary.Result { - splitPair := strings.Split(pair.WsName, "/") - if len(splitPair) != 2 { - continue - } - - cp := types.CurrencyPair{ - Base: strings.ToUpper(splitPair[0]), - Quote: strings.ToUpper(splitPair[1]), - } - availablePairs[cp.String()] = struct{}{} - } - - return availablePairs, nil -} - -// toTickerPrice return a TickerPrice based on the KrakenTicker. -func (ticker KrakenTicker) toTickerPrice(symbol string) (types.TickerPrice, error) { - if len(ticker.C) != 2 || len(ticker.V) != 2 { - return types.TickerPrice{}, fmt.Errorf("error converting KrakenTicker to TickerPrice") - } - // ticker.C has the Price in the first position. - // ticker.V has the totla Value over last 24 hours in the second position. - return types.NewTickerPrice(string(ProviderKraken), symbol, ticker.C[0], ticker.V[1]) -} - -// newKrakenTickerSubscriptionMsg returns a new subscription Msg. -func newKrakenTickerSubscriptionMsg(pairs ...string) KrakenSubscriptionMsg { - return KrakenSubscriptionMsg{ - Event: "subscribe", - Pair: pairs, - Subscription: KrakenSubscriptionChannel{ - Name: "ticker", - }, - } -} - -// newKrakenSubscriptionMsg returns a new subscription Msg. -func newKrakenCandleSubscriptionMsg(pairs ...string) KrakenSubscriptionMsg { - return KrakenSubscriptionMsg{ - Event: "subscribe", - Pair: pairs, - Subscription: KrakenSubscriptionChannel{ - Name: "ohlc", - }, - } -} - -// krakenPairToCurrencyPairSymbol receives a kraken pair formated -// ex.: ATOM/USDT and return currencyPair Symbol ATOMUSDT. -func krakenPairToCurrencyPairSymbol(krakenPair string) string { - return strings.ReplaceAll(krakenPair, "/", "") -} - -// currencyPairToKrakenPair receives a currency pair -// and return kraken ticker symbol ATOM/USDT. -func currencyPairToKrakenPair(cp types.CurrencyPair) string { - return strings.ToUpper(cp.Base + "/" + cp.Quote) -} - -// normalizeKrakenBTCPair changes XBT pairs to BTC, -// since other providers list bitcoin as BTC. -func normalizeKrakenBTCPair(ticker string) string { - return strings.Replace(ticker, "XBT", "BTC", 1) -} diff --git a/price-feeder/oracle/provider/kraken_test.go b/price-feeder/oracle/provider/kraken_test.go deleted file mode 100644 index e5e780044..000000000 --- a/price-feeder/oracle/provider/kraken_test.go +++ /dev/null @@ -1,110 +0,0 @@ -package provider - -import ( - "context" - "testing" - - "github.com/CosmosContracts/juno/price-feeder/oracle/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/rs/zerolog" - "github.com/stretchr/testify/require" -) - -func TestKrakenProvider_GetTickerPrices(t *testing.T) { - p, err := NewKrakenProvider( - context.TODO(), - zerolog.Nop(), - Endpoint{}, - types.CurrencyPair{Base: "BTC", Quote: "USDT"}, - ) - require.NoError(t, err) - - t.Run("valid_request_single_ticker", func(t *testing.T) { - lastPrice := sdk.MustNewDecFromStr("34.69000000") - volume := sdk.MustNewDecFromStr("2396974.02000000") - - tickerMap := map[string]types.TickerPrice{} - tickerMap["ATOMUSDT"] = types.TickerPrice{ - Price: lastPrice, - Volume: volume, - } - - p.tickers = tickerMap - - prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "ATOM", Quote: "USDT"}) - require.NoError(t, err) - require.Len(t, prices, 1) - require.Equal(t, lastPrice, prices["ATOMUSDT"].Price) - require.Equal(t, volume, prices["ATOMUSDT"].Volume) - }) - - t.Run("valid_request_multi_ticker", func(t *testing.T) { - lastPriceAtom := sdk.MustNewDecFromStr("34.69000000") - lastPriceLuna := sdk.MustNewDecFromStr("41.35000000") - volume := sdk.MustNewDecFromStr("2396974.02000000") - - tickerMap := map[string]types.TickerPrice{} - tickerMap["ATOMUSDT"] = types.TickerPrice{ - Price: lastPriceAtom, - Volume: volume, - } - - tickerMap["LUNAUSDT"] = types.TickerPrice{ - Price: lastPriceLuna, - Volume: volume, - } - - p.tickers = tickerMap - prices, err := p.GetTickerPrices( - types.CurrencyPair{Base: "ATOM", Quote: "USDT"}, - types.CurrencyPair{Base: "LUNA", Quote: "USDT"}, - ) - require.NoError(t, err) - require.Len(t, prices, 2) - require.Equal(t, lastPriceAtom, prices["ATOMUSDT"].Price) - require.Equal(t, volume, prices["ATOMUSDT"].Volume) - require.Equal(t, lastPriceLuna, prices["LUNAUSDT"].Price) - require.Equal(t, volume, prices["LUNAUSDT"].Volume) - }) - - t.Run("invalid_request_invalid_ticker", func(t *testing.T) { - prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "FOO", Quote: "BAR"}) - require.EqualError(t, err, "kraken failed to get ticker price for FOOBAR") - require.Nil(t, prices) - }) -} - -func TestKrakenProvider_SubscribeCurrencyPairs(t *testing.T) { - p, err := NewKrakenProvider( - context.TODO(), - zerolog.Nop(), - Endpoint{}, - types.CurrencyPair{Base: "ATOM", Quote: "USDT"}, - ) - require.NoError(t, err) - - t.Run("invalid_subscribe_channels_empty", func(t *testing.T) { - err = p.SubscribeCurrencyPairs([]types.CurrencyPair{}...) - require.ErrorContains(t, err, "currency pairs is empty") - }) -} - -func TestKrakenPairToCurrencyPairSymbol(t *testing.T) { - cp := types.CurrencyPair{Base: "ATOM", Quote: "USDT"} - currencyPairSymbol := krakenPairToCurrencyPairSymbol("ATOM/USDT") - require.Equal(t, cp.String(), currencyPairSymbol) -} - -func TestKrakenCurrencyPairToKrakenPair(t *testing.T) { - cp := types.CurrencyPair{Base: "ATOM", Quote: "USDT"} - krakenSymbol := currencyPairToKrakenPair(cp) - require.Equal(t, krakenSymbol, "ATOM/USDT") -} - -func TestNormalizeKrakenBTCPair(t *testing.T) { - btcSymbol := normalizeKrakenBTCPair("XBT/USDT") - require.Equal(t, btcSymbol, "BTC/USDT") - - atomSymbol := normalizeKrakenBTCPair("ATOM/USDT") - require.Equal(t, atomSymbol, "ATOM/USDT") -} diff --git a/price-feeder/oracle/provider/mexc.go b/price-feeder/oracle/provider/mexc.go deleted file mode 100644 index ab0db2ae5..000000000 --- a/price-feeder/oracle/provider/mexc.go +++ /dev/null @@ -1,349 +0,0 @@ -package provider - -import ( - "context" - "encoding/json" - "fmt" - "net/http" - "net/url" - "strings" - "sync" - - "github.com/CosmosContracts/juno/price-feeder/oracle/types" - "github.com/rs/zerolog" - - "github.com/CosmosContracts/juno/price-feeder/oracle/util" -) - -const ( - mexcWSHost = "wbs.mexc.com" - mexcWSPath = "/raw/ws" - mexcRestHost = "https://www.mexc.com" - mexcRestPath = "/open/api/v2/market/ticker" -) - -var _ Provider = (*MexcProvider)(nil) - -type ( - // MexcProvider defines an Oracle provider implemented by the Mexc public - // API. - // - // REF: https://mxcdevelop.github.io/apidocs/spot_v2_en/#ticker-information - // REF: https://mxcdevelop.github.io/apidocs/spot_v2_en/#k-line - // REF: https://mxcdevelop.github.io/apidocs/spot_v2_en/#overview - MexcProvider struct { - logger zerolog.Logger - mtx sync.RWMutex - endpoints Endpoint - tickers map[string]types.TickerPrice // Symbol => TickerPrice - candles map[string][]types.CandlePrice // Symbol => CandlePrice - subscribedPairs map[string]types.CurrencyPair // Symbol => types.CurrencyPair - } - - // MexcTickerResponse is the ticker price response object. - MexcTickerResponse struct { - Symbol map[string]MexcTicker `json:"data"` // e.x. ATOM_USDT - } - MexcTicker struct { - LastPrice float64 `json:"p"` // Last price ex.: 0.0025 - Volume float64 `json:"v"` // Total traded base asset volume ex.: 1000 - } - - // MexcCandle is the candle websocket response object. - MexcCandleResponse struct { - Symbol string `json:"symbol"` // Symbol ex.: ATOM_USDT - Metadata MexcCandle `json:"data"` // Metadata for candle - } - MexcCandle struct { - Close float64 `json:"c"` // Price at close - TimeStamp int64 `json:"t"` // Close time in unix epoch ex.: 1645756200000 - Volume float64 `json:"v"` // Volume during period - } - - // MexcCandleSubscription Msg to subscribe all the candle channels. - MexcCandleSubscription struct { - OP string `json:"op"` // kline - Symbol string `json:"symbol"` // streams to subscribe ex.: atom_usdt - Interval string `json:"interval"` // Min1、Min5、Min15、Min30 - } - - // MexcTickerSubscription Msg to subscribe all the ticker channels. - MexcTickerSubscription struct { - OP string `json:"op"` // kline - } - - // MexcPairSummary defines the response structure for a Mexc pair - // summary. - MexcPairSummary struct { - Symbol string `json:"symbol"` - } -) - -func NewMexcProvider( - ctx context.Context, - logger zerolog.Logger, - endpoints Endpoint, - pairs ...types.CurrencyPair, -) (*MexcProvider, error) { - if (endpoints.Name) != ProviderMexc { - endpoints = Endpoint{ - Name: ProviderMexc, - Rest: mexcRestHost, - Websocket: mexcWSHost, - } - } - - wsURL := url.URL{ - Scheme: "wss", - Host: endpoints.Websocket, - Path: mexcWSPath, - } - - mexcLogger := logger.With().Str("provider", "mexc").Logger() - - provider := &MexcProvider{ - logger: mexcLogger, - endpoints: endpoints, - tickers: map[string]types.TickerPrice{}, - candles: map[string][]types.CandlePrice{}, - subscribedPairs: map[string]types.CurrencyPair{}, - } - - provider.setSubscribedPairs(pairs...) - - controller := NewWebsocketController( - ctx, - ProviderMexc, - wsURL, - provider.getSubscriptionMsgs(), - provider.messageReceived, - mexcLogger, - ) - go controller.Start() - - return provider, nil -} - -func (p *MexcProvider) getSubscriptionMsgs() []interface{} { - p.mtx.Lock() - defer p.mtx.Unlock() - - subscriptionMsgs := make([]interface{}, 0, len(p.subscribedPairs)+1) - for _, cp := range p.subscribedPairs { - mexcPair := currencyPairToMexcPair(cp) - subscriptionMsgs = append(subscriptionMsgs, newMexcCandleSubscriptionMsg(mexcPair)) - } - subscriptionMsgs = append(subscriptionMsgs, newMexcTickerSubscriptionMsg()) - return subscriptionMsgs -} - -// GetTickerPrices returns the tickerPrices based on the provided pairs. -func (p *MexcProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[string]types.TickerPrice, error) { - tickerPrices := make(map[string]types.TickerPrice, len(pairs)) - - for _, cp := range pairs { - key := currencyPairToMexcPair(cp) - price, err := p.getTickerPrice(key) - if err != nil { - return nil, err - } - tickerPrices[cp.String()] = price - } - - return tickerPrices, nil -} - -// GetCandlePrices returns the candlePrices based on the provided pairs. -func (p *MexcProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[string][]types.CandlePrice, error) { - candlePrices := make(map[string][]types.CandlePrice, len(pairs)) - - for _, cp := range pairs { - key := currencyPairToMexcPair(cp) - prices, err := p.getCandlePrices(key) - if err != nil { - return nil, err - } - candlePrices[cp.String()] = prices - } - - return candlePrices, nil -} - -// SubscribeCurrencyPairs subscribe all currency pairs into ticker and candle channels. -func (p *MexcProvider) SubscribeCurrencyPairs(cps ...types.CurrencyPair) error { - return nil // handled by the websocket controller -} - -func (p *MexcProvider) getTickerPrice(key string) (types.TickerPrice, error) { - p.mtx.RLock() - defer p.mtx.RUnlock() - - ticker, ok := p.tickers[key] - if !ok { - return types.TickerPrice{}, fmt.Errorf( - types.ErrTickerNotFound.Error(), - ProviderMexc, - key, - ) - } - - return ticker, nil -} - -func (p *MexcProvider) getCandlePrices(key string) ([]types.CandlePrice, error) { - p.mtx.RLock() - defer p.mtx.RUnlock() - - candles, ok := p.candles[key] - if !ok { - return []types.CandlePrice{}, fmt.Errorf( - types.ErrCandleNotFound.Error(), - ProviderMexc, - key, - ) - } - - return candles, nil -} - -func (p *MexcProvider) messageReceived(messageType int, bz []byte) { - var ( - tickerResp MexcTickerResponse - tickerErr error - candleResp MexcCandleResponse - candleErr error - ) - - tickerErr = json.Unmarshal(bz, &tickerResp) - for _, cp := range p.subscribedPairs { - mexcPair := currencyPairToMexcPair(cp) - if tickerResp.Symbol[mexcPair].LastPrice != 0 { - p.setTickerPair( - mexcPair, - tickerResp.Symbol[mexcPair], - ) - telemetryWebsocketMessage(ProviderMexc, MessageTypeTicker) - return - } - } - - candleErr = json.Unmarshal(bz, &candleResp) - if candleResp.Metadata.Close != 0 { - p.setCandlePair(candleResp) - telemetryWebsocketMessage(ProviderMexc, MessageTypeCandle) - return - } - - if tickerErr != nil || candleErr != nil { - p.logger.Error(). - Int("length", len(bz)). - AnErr("ticker", tickerErr). - AnErr("candle", candleErr). - Msg("mexc: Error on receive message") - } -} - -func (p *MexcProvider) setTickerPair(symbol string, ticker MexcTicker) { - p.mtx.Lock() - defer p.mtx.Unlock() - - price, err := util.NewDecFromFloat(ticker.LastPrice) - if err != nil { - p.logger.Warn().Err(err).Msg("mexc: failed to parse ticker price") - } - volume, err := util.NewDecFromFloat(ticker.Volume) - if err != nil { - p.logger.Warn().Err(err).Msg("mexc: failed to parse ticker volume") - } - - p.tickers[symbol] = types.TickerPrice{ - Price: price, - Volume: volume, - } -} - -func (p *MexcProvider) setCandlePair(candleResp MexcCandleResponse) { - p.mtx.Lock() - defer p.mtx.Unlock() - - close, err := util.NewDecFromFloat(candleResp.Metadata.Close) - if err != nil { - p.logger.Warn().Err(err).Msg("mexc: failed to parse candle close") - } - volume, err := util.NewDecFromFloat(candleResp.Metadata.Volume) - if err != nil { - p.logger.Warn().Err(err).Msg("mexc: failed to parse candle volume") - } - candle := types.CandlePrice{ - Price: close, - Volume: volume, - // convert seconds -> milli - TimeStamp: SecondsToMilli(candleResp.Metadata.TimeStamp), - } - - staleTime := PastUnixTime(providerCandlePeriod) - candleList := []types.CandlePrice{} - candleList = append(candleList, candle) - - for _, c := range p.candles[candleResp.Symbol] { - if staleTime < c.TimeStamp { - candleList = append(candleList, c) - } - } - - p.candles[candleResp.Symbol] = candleList -} - -// setSubscribedPairs sets N currency pairs to the map of subscribed pairs. -func (p *MexcProvider) setSubscribedPairs(cps ...types.CurrencyPair) { - p.mtx.Lock() - defer p.mtx.Unlock() - - for _, cp := range cps { - p.subscribedPairs[cp.String()] = cp - } -} - -// GetAvailablePairs returns all pairs to which the provider can subscribe. -// ex.: map["ATOMUSDT" => {}, "UMEEUSDC" => {}]. -func (p *MexcProvider) GetAvailablePairs() (map[string]struct{}, error) { - resp, err := http.Get(p.endpoints.Rest + mexcRestPath) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - var pairsSummary []MexcPairSummary - if err := json.NewDecoder(resp.Body).Decode(&pairsSummary); err != nil { - return nil, err - } - - availablePairs := make(map[string]struct{}, len(pairsSummary)) - for _, pairName := range pairsSummary { - availablePairs[strings.ToUpper(pairName.Symbol)] = struct{}{} - } - - return availablePairs, nil -} - -// currencyPairToMexcPair receives a currency pair and return mexc -// ticker symbol atomusdt@ticker. -func currencyPairToMexcPair(cp types.CurrencyPair) string { - return strings.ToUpper(cp.Base + "_" + cp.Quote) -} - -// newMexcCandleSubscriptionMsg returns a new candle subscription Msg. -func newMexcCandleSubscriptionMsg(param string) MexcCandleSubscription { - return MexcCandleSubscription{ - OP: "sub.kline", - Symbol: param, - Interval: "Min1", - } -} - -// newMexcTickerSubscriptionMsg returns a new ticker subscription Msg. -func newMexcTickerSubscriptionMsg() MexcTickerSubscription { - return MexcTickerSubscription{ - OP: "sub.overview", - } -} diff --git a/price-feeder/oracle/provider/mexc_test.go b/price-feeder/oracle/provider/mexc_test.go deleted file mode 100644 index 84d6868ea..000000000 --- a/price-feeder/oracle/provider/mexc_test.go +++ /dev/null @@ -1,102 +0,0 @@ -package provider - -import ( - "context" - "encoding/json" - "fmt" - "testing" - - "github.com/CosmosContracts/juno/price-feeder/oracle/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/rs/zerolog" - "github.com/stretchr/testify/require" -) - -func TestMexcProvider_GetTickerPrices(t *testing.T) { - p, err := NewMexcProvider( - context.TODO(), - zerolog.Nop(), - Endpoint{}, - types.CurrencyPair{Base: "ATOM", Quote: "USDT"}, - ) - require.NoError(t, err) - - t.Run("valid_request_single_ticker", func(t *testing.T) { - lastPrice := sdk.MustNewDecFromStr("34.69000000") - volume := sdk.MustNewDecFromStr("2396974.02000000") - - tickerMap := map[string]types.TickerPrice{} - tickerMap["ATOM_USDT"] = types.TickerPrice{ - Price: lastPrice, - Volume: volume, - } - - p.tickers = tickerMap - - prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "ATOM", Quote: "USDT"}) - require.NoError(t, err) - require.Len(t, prices, 1) - require.Equal(t, lastPrice, prices["ATOMUSDT"].Price) - require.Equal(t, volume, prices["ATOMUSDT"].Volume) - }) - - t.Run("valid_request_multi_ticker", func(t *testing.T) { - lastPriceAtom := sdk.MustNewDecFromStr("34.69000000") - lastPriceLuna := sdk.MustNewDecFromStr("41.35000000") - volume := sdk.MustNewDecFromStr("2396974.02000000") - - tickerMap := map[string]types.TickerPrice{} - tickerMap["ATOM_USDT"] = types.TickerPrice{ - Price: lastPriceAtom, - Volume: volume, - } - - tickerMap["LUNA_USDT"] = types.TickerPrice{ - Price: lastPriceLuna, - Volume: volume, - } - - p.tickers = tickerMap - prices, err := p.GetTickerPrices( - types.CurrencyPair{Base: "ATOM", Quote: "USDT"}, - types.CurrencyPair{Base: "LUNA", Quote: "USDT"}, - ) - require.NoError(t, err) - require.Len(t, prices, 2) - require.Equal(t, lastPriceAtom, prices["ATOMUSDT"].Price) - require.Equal(t, volume, prices["ATOMUSDT"].Volume) - require.Equal(t, lastPriceLuna, prices["LUNAUSDT"].Price) - require.Equal(t, volume, prices["LUNAUSDT"].Volume) - }) - - t.Run("invalid_request_invalid_ticker", func(t *testing.T) { - prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "FOO", Quote: "BAR"}) - require.Error(t, err) - require.Equal(t, "mexc failed to get ticker price for FOO_BAR", err.Error()) - require.Nil(t, prices) - }) -} - -func TestMexcCurrencyPairToMexcPair(t *testing.T) { - cp := types.CurrencyPair{Base: "ATOM", Quote: "USDT"} - MexcSymbol := currencyPairToMexcPair(cp) - require.Equal(t, MexcSymbol, "ATOM_USDT") -} - -func TestMexcProvider_getSubscriptionMsgs(t *testing.T) { - provider := &MexcProvider{ - subscribedPairs: map[string]types.CurrencyPair{}, - } - cps := []types.CurrencyPair{ - {Base: "ATOM", Quote: "USDT"}, - } - provider.setSubscribedPairs(cps...) - subMsgs := provider.getSubscriptionMsgs() - fmt.Printf("%+v\n", subMsgs) - - msg, _ := json.Marshal(subMsgs[0]) - require.Equal(t, "{\"op\":\"sub.kline\",\"symbol\":\"ATOM_USDT\",\"interval\":\"Min1\"}", string(msg)) - - msg, _ = json.Marshal(subMsgs[1]) - require.Equal(t, "{\"op\":\"sub.overview\"}", string(msg)) -} diff --git a/price-feeder/oracle/provider/mock.go b/price-feeder/oracle/provider/mock.go deleted file mode 100644 index dc7eb312d..000000000 --- a/price-feeder/oracle/provider/mock.go +++ /dev/null @@ -1,152 +0,0 @@ -package provider - -import ( - "encoding/csv" - "fmt" - "net/http" - "strings" - "time" - - "github.com/CosmosContracts/juno/price-feeder/oracle/types" - sdk "github.com/cosmos/cosmos-sdk/types" -) - -const ( - // Google Sheets document containing mock exchange rates. - // - // Ref: https://docs.google.com/spreadsheets/d/1DfVh2Xwxfehcwo08h2sBgaqL-2Jem1ri_prsQ3ayFeE/edit?usp=sharing - mockBaseURL = "https://docs.google.com/spreadsheets/d/e/2PACX-1vQRVD0IMn8ZdRgmE2XeNkwjpSGglwelx1z0-hNV2ejfstVeuL2xF8i3EISBZfrGTjVTI0EXW9Wwq4F-/pub?output=csv" -) - -var _ Provider = (*MockProvider)(nil) - -type ( - // MockProvider defines a mocked exchange rate provider using a published - // Google sheets document to fetch mocked/fake exchange rates. - MockProvider struct { - baseURL string - client *http.Client - } -) - -func NewMockProvider() *MockProvider { - return &MockProvider{ - baseURL: mockBaseURL, - client: &http.Client{ - Timeout: defaultTimeout, - // the mock provider is the only one which allows redirects - // because it gets prices from a google spreadsheet, which redirects - }, - } -} - -func (p MockProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[string]types.TickerPrice, error) { - tickerPrices := make(map[string]types.TickerPrice, len(pairs)) - - resp, err := p.client.Get(p.baseURL) - if err != nil { - return nil, err - } - - defer resp.Body.Close() - - csvReader := csv.NewReader(resp.Body) - records, err := csvReader.ReadAll() - if err != nil { - return nil, err - } - - tickerMap := make(map[string]struct{}) - for _, cp := range pairs { - tickerMap[strings.ToUpper(cp.String())] = struct{}{} - } - - // Records are of the form [base, quote, price, volume] and we skip the first - // record as that contains the header. - for _, r := range records[1:] { - ticker := strings.ToUpper(r[0] + r[1]) - if _, ok := tickerMap[ticker]; !ok { - // skip records that are not requested - continue - } - - price, err := sdk.NewDecFromStr(r[2]) - if err != nil { - return nil, fmt.Errorf("failed to read mock price (%s) for %s", r[2], ticker) - } - - volume, err := sdk.NewDecFromStr(r[3]) - if err != nil { - return nil, fmt.Errorf("failed to read mock volume (%s) for %s", r[3], ticker) - } - - if _, ok := tickerPrices[ticker]; ok { - return nil, fmt.Errorf("found duplicate ticker: %s", ticker) - } - - tickerPrices[ticker] = types.TickerPrice{Price: price, Volume: volume} - } - - for t := range tickerMap { - if _, ok := tickerPrices[t]; !ok { - return nil, fmt.Errorf(types.ErrMissingExchangeRate.Error(), t) - } - } - - return tickerPrices, nil -} - -func (p MockProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[string][]types.CandlePrice, error) { - price, err := p.GetTickerPrices(pairs...) - if err != nil { - return nil, err - } - candles := make(map[string][]types.CandlePrice) - for pair, price := range price { - candles[pair] = []types.CandlePrice{ - { - Price: price.Price, - Volume: price.Volume, - TimeStamp: PastUnixTime(1 * time.Minute), - }, - } - } - return candles, nil -} - -// SubscribeCurrencyPairs performs a no-op since mock does not use websockets -func (p MockProvider) SubscribeCurrencyPairs(pairs ...types.CurrencyPair) error { - return nil -} - -// GetAvailablePairs return all available pairs symbol to susbscribe. -func (p MockProvider) GetAvailablePairs() (map[string]struct{}, error) { - resp, err := http.Get(p.baseURL) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - csvReader := csv.NewReader(resp.Body) - records, err := csvReader.ReadAll() - if err != nil { - return nil, err - } - - // Records are of the form [base, quote, price, volume] and we skip the first - // record as that contains the header. - availablePairs := make(map[string]struct{}, len(records[1:])) - for _, r := range records[1:] { - if len(r) < 2 { - continue - } - - cp := types.CurrencyPair{ - Base: strings.ToUpper(r[0]), - Quote: strings.ToUpper(r[1]), - } - availablePairs[cp.String()] = struct{}{} - } - - return availablePairs, nil -} diff --git a/price-feeder/oracle/provider/mock_test.go b/price-feeder/oracle/provider/mock_test.go deleted file mode 100644 index 1c256a765..000000000 --- a/price-feeder/oracle/provider/mock_test.go +++ /dev/null @@ -1,77 +0,0 @@ -package provider - -import ( - "net/http" - "net/http/httptest" - "testing" - - "github.com/CosmosContracts/juno/price-feeder/oracle/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" -) - -func TestMockProvider_GetTickerPrices(t *testing.T) { - mp := NewMockProvider() - - t.Run("valid_request_single_ticker", func(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { - require.Equal(t, "/", req.URL.String()) - resp := `Base,Quote,Price,Volume -UMEE,USDT,3.04,1827884.77 -ATOM,USDC,21.84,1827884.77 -` - rw.Write([]byte(resp)) //nolint:errcheck - })) - defer server.Close() - - mp.client = server.Client() - mp.baseURL = server.URL - - prices, err := mp.GetTickerPrices(types.CurrencyPair{Base: "UMEE", Quote: "USDT"}) - require.NoError(t, err) - require.Len(t, prices, 1) - require.Equal(t, sdk.MustNewDecFromStr("3.04"), prices["UMEEUSDT"].Price) - require.Equal(t, sdk.MustNewDecFromStr("1827884.77"), prices["UMEEUSDT"].Volume) - }) - - t.Run("valid_request_multi_ticker", func(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { - require.Equal(t, "/", req.URL.String()) - resp := `Base,Quote,Price,Volume -UMEE,USDT,3.04,1827884.77 -ATOM,USDC,21.84,1827884.77 -` - rw.Write([]byte(resp)) //nolint:errcheck - })) - defer server.Close() - - mp.client = server.Client() - mp.baseURL = server.URL - - prices, err := mp.GetTickerPrices( - types.CurrencyPair{Base: "UMEE", Quote: "USDT"}, - types.CurrencyPair{Base: "ATOM", Quote: "USDC"}, - ) - require.NoError(t, err) - require.Len(t, prices, 2) - require.Equal(t, sdk.MustNewDecFromStr("3.04"), prices["UMEEUSDT"].Price) - require.Equal(t, sdk.MustNewDecFromStr("1827884.77"), prices["UMEEUSDT"].Volume) - require.Equal(t, sdk.MustNewDecFromStr("21.84"), prices["ATOMUSDC"].Price) - require.Equal(t, sdk.MustNewDecFromStr("1827884.77"), prices["ATOMUSDC"].Volume) - }) - - t.Run("invalid_request_bad_response", func(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { - require.Equal(t, "/", req.URL.String()) - rw.Write([]byte(`FOO`)) //nolint:errcheck - })) - defer server.Close() - - mp.client = server.Client() - mp.baseURL = server.URL - - prices, err := mp.GetTickerPrices(types.CurrencyPair{Base: "UMEE", Quote: "USDT"}) - require.Error(t, err) - require.Nil(t, prices) - }) -} diff --git a/price-feeder/oracle/provider/okx.go b/price-feeder/oracle/provider/okx.go deleted file mode 100644 index aa4998376..000000000 --- a/price-feeder/oracle/provider/okx.go +++ /dev/null @@ -1,518 +0,0 @@ -package provider - -import ( - "context" - "encoding/json" - "fmt" - "net/http" - "net/url" - "strconv" - "strings" - "sync" - "time" - - "github.com/gorilla/websocket" - "github.com/rs/zerolog" - - "github.com/CosmosContracts/juno/price-feeder/oracle/types" -) - -const ( - okxWSHost = "ws.okx.com:8443" - okxWSPath = "/ws/v5/public" - okxPingCheck = time.Second * 28 // should be < 30 - okxRestHost = "https://www.okx.com" - okxRestPath = "/api/v5/market/tickers?instType=SPOT" -) - -var _ Provider = (*OkxProvider)(nil) - -type ( - // OkxProvider defines an Oracle provider implemented by the Okx public - // API. - // - // REF: https://www.okx.com/docs-v5/en/#websocket-api-public-channel-tickers-channel - OkxProvider struct { - wsURL url.URL - wsClient *websocket.Conn - logger zerolog.Logger - reconnectTimer *time.Ticker - mtx sync.RWMutex - endpoints Endpoint - tickers map[string]OkxTickerPair // InstId => OkxTickerPair - candles map[string][]OkxCandlePair // InstId => 0kxCandlePair - subscribedPairs map[string]types.CurrencyPair // Symbol => types.CurrencyPair - } - - // OkxInstId defines the id Symbol of an pair. - OkxInstID struct { - InstID string `json:"instId"` // Instrument ID ex.: BTC-USDT - } - - // OkxTickerPair defines a ticker pair of Okx. - OkxTickerPair struct { - OkxInstID - Last string `json:"last"` // Last traded price ex.: 43508.9 - Vol24h string `json:"vol24h"` // 24h trading volume ex.: 11159.87127845 - } - - // OkxInst defines the structure containing ID information for the OkxResponses. - OkxID struct { - OkxInstID - Channel string `json:"channel"` - } - - // OkxTickerResponse defines the response structure of a Okx ticker request. - OkxTickerResponse struct { - Data []OkxTickerPair `json:"data"` - ID OkxID `json:"arg"` - } - - // OkxCandlePair defines a candle for Okx. - OkxCandlePair struct { - Close string `json:"c"` // Close price for this time period - TimeStamp int64 `json:"ts"` // Linux epoch timestamp - Volume string `json:"vol"` // Volume for this time period - InstID string `json:"instId"` // Instrument ID ex.: BTC-USDT - } - - // OkxCandleResponse defines the response structure of a Okx candle request. - OkxCandleResponse struct { - Data [][]string `json:"data"` - ID OkxID `json:"arg"` - } - - // OkxSubscriptionTopic Topic with the ticker to be subscribed/unsubscribed. - OkxSubscriptionTopic struct { - Channel string `json:"channel"` // Channel name ex.: tickers - InstID string `json:"instId"` // Instrument ID ex.: BTC-USDT - } - - // OkxSubscriptionMsg Message to subscribe/unsubscribe with N Topics. - OkxSubscriptionMsg struct { - Op string `json:"op"` // Operation ex.: subscribe - Args []OkxSubscriptionTopic `json:"args"` - } - - // OkxPairsSummary defines the response structure for an Okx pairs summary. - OkxPairsSummary struct { - Data []OkxInstID `json:"data"` - } -) - -// NewOkxProvider creates a new OkxProvider. -func NewOkxProvider( - ctx context.Context, - logger zerolog.Logger, - endpoints Endpoint, - pairs ...types.CurrencyPair, -) (*OkxProvider, error) { - if endpoints.Name != ProviderOkx { - endpoints = Endpoint{ - Name: ProviderOkx, - Rest: okxRestHost, - Websocket: okxWSHost, - } - } - - wsURL := url.URL{ - Scheme: "wss", - Host: endpoints.Websocket, - Path: okxWSPath, - } - - wsConn, resp, err := websocket.DefaultDialer.Dial(wsURL.String(), nil) - defer resp.Body.Close() - if err != nil { - return nil, fmt.Errorf( - types.ErrWebsocketDial.Error(), - ProviderOkx, - err, - ) - } - - provider := &OkxProvider{ - wsURL: wsURL, - wsClient: wsConn, - logger: logger.With().Str("provider", string(ProviderOkx)).Logger(), - reconnectTimer: time.NewTicker(okxPingCheck), - endpoints: endpoints, - tickers: map[string]OkxTickerPair{}, - candles: map[string][]OkxCandlePair{}, - subscribedPairs: map[string]types.CurrencyPair{}, - } - provider.wsClient.SetPongHandler(provider.pongHandler) - - if err := provider.SubscribeCurrencyPairs(pairs...); err != nil { - return nil, err - } - - go provider.handleReceivedTickers(ctx) - - return provider, nil -} - -// GetTickerPrices returns the tickerPrices based on the saved map. -func (p *OkxProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[string]types.TickerPrice, error) { - tickerPrices := make(map[string]types.TickerPrice, len(pairs)) - - for _, currencyPair := range pairs { - price, err := p.getTickerPrice(currencyPair) - if err != nil { - return nil, err - } - - tickerPrices[currencyPair.String()] = price - } - - return tickerPrices, nil -} - -// GetCandlePrices returns the candlePrices based on the saved map -func (p *OkxProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[string][]types.CandlePrice, error) { - candlePrices := make(map[string][]types.CandlePrice, len(pairs)) - - for _, currencyPair := range pairs { - candles, err := p.getCandlePrices(currencyPair) - if err != nil { - return nil, err - } - - candlePrices[currencyPair.String()] = candles - } - - return candlePrices, nil -} - -// SubscribeCurrencyPairs subscribe all currency pairs into ticker and candle channels. -func (p *OkxProvider) SubscribeCurrencyPairs(cps ...types.CurrencyPair) error { - if len(cps) == 0 { - return fmt.Errorf("currency pairs is empty") - } - - if err := p.subscribeChannels(cps...); err != nil { - return err - } - - p.setSubscribedPairs(cps...) - telemetryWebsocketSubscribeCurrencyPairs(ProviderOkx, len(cps)) - return nil -} - -// subscribeChannels subscribe all currency pairs into ticker and candle channels. -func (p *OkxProvider) subscribeChannels(cps ...types.CurrencyPair) error { - if err := p.subscribeTickers(cps...); err != nil { - return err - } - - return p.subscribeCandles(cps...) -} - -// subscribeTickers subscribe all currency pairs into ticker channel. -func (p *OkxProvider) subscribeTickers(cps ...types.CurrencyPair) error { - topics := make([]OkxSubscriptionTopic, len(cps)) - - for i, cp := range cps { - topics[i] = newOkxTickerSubscriptionTopic(currencyPairToOkxPair(cp)) - } - - return p.subscribePairs(topics...) -} - -// subscribeCandles subscribe all currency pairs into candle channel. -func (p *OkxProvider) subscribeCandles(cps ...types.CurrencyPair) error { - topics := make([]OkxSubscriptionTopic, len(cps)) - - for i, cp := range cps { - topics[i] = newOkxCandleSubscriptionTopic(currencyPairToOkxPair(cp)) - } - - return p.subscribePairs(topics...) -} - -// subscribedPairsToSlice returns the map of subscribed pairs as slice -func (p *OkxProvider) subscribedPairsToSlice() []types.CurrencyPair { - p.mtx.RLock() - defer p.mtx.RUnlock() - - return types.MapPairsToSlice(p.subscribedPairs) -} - -func (p *OkxProvider) getTickerPrice(cp types.CurrencyPair) (types.TickerPrice, error) { - p.mtx.RLock() - defer p.mtx.RUnlock() - - instrumentID := currencyPairToOkxPair(cp) - tickerPair, ok := p.tickers[instrumentID] - if !ok { - return types.TickerPrice{}, fmt.Errorf("okx failed to get ticker price for %s", instrumentID) - } - - return tickerPair.toTickerPrice() -} - -func (p *OkxProvider) getCandlePrices(cp types.CurrencyPair) ([]types.CandlePrice, error) { - p.mtx.RLock() - defer p.mtx.RUnlock() - - instrumentID := currencyPairToOkxPair(cp) - candles, ok := p.candles[instrumentID] - if !ok { - return []types.CandlePrice{}, fmt.Errorf("okx failed to get candle prices for %s", instrumentID) - } - candleList := []types.CandlePrice{} - for _, candle := range candles { - cp, err := candle.toCandlePrice() - if err != nil { - return []types.CandlePrice{}, err - } - candleList = append(candleList, cp) - } - - return candleList, nil -} - -func (p *OkxProvider) handleReceivedTickers(ctx context.Context) { - for { - select { - case <-ctx.Done(): - return - case <-time.After(defaultReadNewWSMessage): - messageType, bz, err := p.wsClient.ReadMessage() - if err != nil { - // if some error occurs continue to try to read the next message. - p.logger.Err(err).Msg("could not read message") - if err := p.ping(); err != nil { - p.logger.Err(err).Msg("could not send ping") - } - continue - } - - if len(bz) == 0 { - continue - } - - p.resetReconnectTimer() - p.messageReceived(messageType, bz) - - case <-p.reconnectTimer.C: // reset by the pongHandler. - if err := p.disconnect(); err != nil { - p.logger.Err(err).Msg("error disconnecting") - } - if err := p.reconnect(); err != nil { - p.logger.Err(err).Msg("error reconnecting") - } - } - } -} - -func (p *OkxProvider) messageReceived(messageType int, bz []byte) { - if messageType != websocket.TextMessage { - return - } - - var ( - tickerResp OkxTickerResponse - tickerErr error - candleResp OkxCandleResponse - candleErr error - ) - - // sometimes the message received is not a ticker or a candle response. - tickerErr = json.Unmarshal(bz, &tickerResp) - if tickerResp.ID.Channel == "tickers" { - for _, tickerPair := range tickerResp.Data { - p.setTickerPair(tickerPair) - telemetryWebsocketMessage(ProviderOkx, MessageTypeTicker) - } - return - } - - candleErr = json.Unmarshal(bz, &candleResp) - if candleResp.ID.Channel == "candle1m" { - for _, candlePair := range candleResp.Data { - p.setCandlePair(candlePair, candleResp.ID.InstID) - telemetryWebsocketMessage(ProviderOkx, MessageTypeCandle) - } - return - } - - p.logger.Error(). - Int("length", len(bz)). - AnErr("ticker", tickerErr). - AnErr("candle", candleErr). - Msg("Error on receive message") -} - -func (p *OkxProvider) setTickerPair(tickerPair OkxTickerPair) { - p.mtx.Lock() - defer p.mtx.Unlock() - p.tickers[tickerPair.InstID] = tickerPair -} - -// subscribePairs write the subscription msg to the provider. -func (p *OkxProvider) subscribePairs(pairs ...OkxSubscriptionTopic) error { - subsMsg := newOkxSubscriptionMsg(pairs...) - return p.wsClient.WriteJSON(subsMsg) -} - -func (p *OkxProvider) setCandlePair(pairData []string, instID string) { - p.mtx.Lock() - defer p.mtx.Unlock() - - ts, err := strconv.ParseInt(pairData[0], 10, 64) - if err != nil { - return - } - // the candlesticks channel uses an array of strings. - candle := OkxCandlePair{ - Close: pairData[4], - InstID: instID, - Volume: pairData[5], - TimeStamp: ts, - } - staleTime := PastUnixTime(providerCandlePeriod) - candleList := []OkxCandlePair{} - - candleList = append(candleList, candle) - for _, c := range p.candles[instID] { - if staleTime < c.TimeStamp { - candleList = append(candleList, c) - } - } - p.candles[instID] = candleList -} - -// setSubscribedPairs sets N currency pairs to the map of subscribed pairs. -func (p *OkxProvider) setSubscribedPairs(cps ...types.CurrencyPair) { - p.mtx.Lock() - defer p.mtx.Unlock() - - for _, cp := range cps { - p.subscribedPairs[cp.String()] = cp - } -} - -func (p *OkxProvider) resetReconnectTimer() { - p.reconnectTimer.Reset(okxPingCheck) -} - -// disconnect disconnects the existing websocket connection. -func (p *OkxProvider) disconnect() error { - err := p.wsClient.Close() - if err != nil { - return types.ErrProviderConnection.Wrapf("error closing Okx websocket %v", err) - } - return nil -} - -// reconnect creates a websocket connection. If there’s a -// network problem, the system will automatically disable the connection. The -// connection will break automatically if the subscription is not established or -// data has not been pushed for more than 30 seconds. To keep the connection stable: -// 1. Set a timer of N seconds whenever a response message is received, where N is -// less than 30. -// 2. If the timer is triggered, which means that no new message is received within -// N seconds, send the String 'ping'. -// 3. Expect a 'pong' as a response. If the response message is not received within -// N seconds, please raise an error or reconnect. -func (p *OkxProvider) reconnect() error { - p.logger.Debug().Msg("reconnecting websocket") - wsConn, resp, err := websocket.DefaultDialer.Dial(p.wsURL.String(), nil) - defer resp.Body.Close() - if err != nil { - return fmt.Errorf( - types.ErrWebsocketDial.Error(), - ProviderOkx, - err, - ) - } - wsConn.SetPongHandler(p.pongHandler) - p.wsClient = wsConn - - currencyPairs := p.subscribedPairsToSlice() - - telemetryWebsocketReconnect(ProviderOkx) - return p.subscribeChannels(currencyPairs...) -} - -// ping to check websocket connection. -func (p *OkxProvider) ping() error { - return p.wsClient.WriteMessage(websocket.PingMessage, ping) -} - -func (p *OkxProvider) pongHandler(appData string) error { - p.resetReconnectTimer() - return nil -} - -// GetAvailablePairs return all available pairs symbol to susbscribe. -func (p *OkxProvider) GetAvailablePairs() (map[string]struct{}, error) { - resp, err := http.Get(p.endpoints.Rest + okxRestPath) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - var pairsSummary struct { - Data []OkxInstID `json:"data"` - } - - if err := json.NewDecoder(resp.Body).Decode(&pairsSummary); err != nil { - return nil, err - } - - availablePairs := make(map[string]struct{}, len(pairsSummary.Data)) - for _, pair := range pairsSummary.Data { - splitInstID := strings.Split(pair.InstID, "-") - if len(splitInstID) != 2 { - continue - } - - cp := types.CurrencyPair{ - Base: strings.ToUpper(splitInstID[0]), - Quote: strings.ToUpper(splitInstID[1]), - } - availablePairs[cp.String()] = struct{}{} - } - - return availablePairs, nil -} - -func (ticker OkxTickerPair) toTickerPrice() (types.TickerPrice, error) { - return types.NewTickerPrice(string(ProviderOkx), ticker.InstID, ticker.Last, ticker.Vol24h) -} - -func (candle OkxCandlePair) toCandlePrice() (types.CandlePrice, error) { - return types.NewCandlePrice(string(ProviderOkx), candle.InstID, candle.Close, candle.Volume, candle.TimeStamp) -} - -// currencyPairToOkxPair returns the expected pair instrument ID for Okx -// ex.: "BTC-USDT". -func currencyPairToOkxPair(pair types.CurrencyPair) string { - return pair.Base + "-" + pair.Quote -} - -// newOkxTickerSubscriptionTopic returns a new subscription topic. -func newOkxTickerSubscriptionTopic(instID string) OkxSubscriptionTopic { - return OkxSubscriptionTopic{ - Channel: "tickers", - InstID: instID, - } -} - -// newOkxSubscriptionTopic returns a new subscription topic. -func newOkxCandleSubscriptionTopic(instID string) OkxSubscriptionTopic { - return OkxSubscriptionTopic{ - Channel: "candle1m", - InstID: instID, - } -} - -// newOkxSubscriptionMsg returns a new subscription Msg for Okx. -func newOkxSubscriptionMsg(args ...OkxSubscriptionTopic) OkxSubscriptionMsg { - return OkxSubscriptionMsg{ - Op: "subscribe", - Args: args, - } -} diff --git a/price-feeder/oracle/provider/okx_test.go b/price-feeder/oracle/provider/okx_test.go deleted file mode 100644 index 6d9a5ac80..000000000 --- a/price-feeder/oracle/provider/okx_test.go +++ /dev/null @@ -1,105 +0,0 @@ -package provider - -import ( - "context" - "testing" - - "github.com/CosmosContracts/juno/price-feeder/oracle/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/rs/zerolog" - "github.com/stretchr/testify/require" -) - -func TestOkxProvider_GetTickerPrices(t *testing.T) { - p, err := NewOkxProvider( - context.TODO(), - zerolog.Nop(), - Endpoint{}, - types.CurrencyPair{Base: "BTC", Quote: "USDT"}, - ) - require.NoError(t, err) - - t.Run("valid_request_single_ticker", func(t *testing.T) { - lastPrice := "34.69000000" - volume := "2396974.02000000" - - syncMap := map[string]OkxTickerPair{} - syncMap["ATOM-USDT"] = OkxTickerPair{ - OkxInstID: OkxInstID{ - InstID: "ATOM-USDT", - }, - Last: lastPrice, - Vol24h: volume, - } - - p.tickers = syncMap - - prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "ATOM", Quote: "USDT"}) - require.NoError(t, err) - require.Len(t, prices, 1) - require.Equal(t, sdk.MustNewDecFromStr(lastPrice), prices["ATOMUSDT"].Price) - require.Equal(t, sdk.MustNewDecFromStr(volume), prices["ATOMUSDT"].Volume) - }) - - t.Run("valid_request_multi_ticker", func(t *testing.T) { - lastPriceAtom := "34.69000000" - lastPriceLuna := "41.35000000" - volume := "2396974.02000000" - - syncMap := map[string]OkxTickerPair{} - syncMap["ATOM-USDT"] = OkxTickerPair{ - OkxInstID: OkxInstID{ - InstID: "ATOM-USDT", - }, - Last: lastPriceAtom, - Vol24h: volume, - } - - syncMap["LUNA-USDT"] = OkxTickerPair{ - OkxInstID: OkxInstID{ - InstID: "LUNA-USDT", - }, - Last: lastPriceLuna, - Vol24h: volume, - } - - p.tickers = syncMap - prices, err := p.GetTickerPrices( - types.CurrencyPair{Base: "ATOM", Quote: "USDT"}, - types.CurrencyPair{Base: "LUNA", Quote: "USDT"}, - ) - require.NoError(t, err) - require.Len(t, prices, 2) - require.Equal(t, sdk.MustNewDecFromStr(lastPriceAtom), prices["ATOMUSDT"].Price) - require.Equal(t, sdk.MustNewDecFromStr(volume), prices["ATOMUSDT"].Volume) - require.Equal(t, sdk.MustNewDecFromStr(lastPriceLuna), prices["LUNAUSDT"].Price) - require.Equal(t, sdk.MustNewDecFromStr(volume), prices["LUNAUSDT"].Volume) - }) - - t.Run("invalid_request_invalid_ticker", func(t *testing.T) { - prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "FOO", Quote: "BAR"}) - require.EqualError(t, err, "okx failed to get ticker price for FOO-BAR") - require.Nil(t, prices) - }) -} - -func TestOkxProvider_SubscribeCurrencyPairs(t *testing.T) { - p, err := NewOkxProvider( - context.TODO(), - zerolog.Nop(), - Endpoint{}, - types.CurrencyPair{Base: "ATOM", Quote: "USDT"}, - ) - require.NoError(t, err) - - t.Run("invalid_subscribe_channels_empty", func(t *testing.T) { - err = p.SubscribeCurrencyPairs([]types.CurrencyPair{}...) - require.ErrorContains(t, err, "currency pairs is empty") - }) -} - -func TestOkxCurrencyPairToOkxPair(t *testing.T) { - cp := types.CurrencyPair{Base: "ATOM", Quote: "USDT"} - okxSymbol := currencyPairToOkxPair(cp) - require.Equal(t, okxSymbol, "ATOM-USDT") -} diff --git a/price-feeder/oracle/provider/osmosis.go b/price-feeder/oracle/provider/osmosis.go deleted file mode 100644 index 01127a7d3..000000000 --- a/price-feeder/oracle/provider/osmosis.go +++ /dev/null @@ -1,224 +0,0 @@ -package provider - -import ( - "encoding/json" - "fmt" - "io" - "net/http" - "strings" - - "github.com/CosmosContracts/juno/price-feeder/oracle/types" - "github.com/CosmosContracts/juno/price-feeder/oracle/util" -) - -const ( - osmosisRestURL = "https://api-osmosis.imperator.co" - osmosisTokenEndpoint = "/tokens/v2" - osmosisCandleEndpoint = "/tokens/v2/historical" - osmosisPairsEndpoint = "/pairs/v1/summary" -) - -var _ Provider = (*OsmosisProvider)(nil) - -type ( - // OsmosisProvider defines an Oracle provider implemented by the Osmosis public - // API. - // - // REF: https://api-osmosis.imperator.co/swagger/ - OsmosisProvider struct { - baseURL string - client *http.Client - } - - // OsmosisTokenResponse defines the response structure for an Osmosis token - // request. - OsmosisTokenResponse struct { - Price float64 `json:"price"` - Symbol string `json:"symbol"` - Volume float64 `json:"volume_24h"` - } - - // OsmosisCandleResponse defines the response structure for an Osmosis candle - // request. - OsmosisCandleResponse struct { - Time int64 `json:"time"` - Close float64 `json:"close"` - Volume float64 `json:"volume"` - } - - // OsmosisPairsSummary defines the response structure for an Osmosis pairs - // summary. - OsmosisPairsSummary struct { - Data []OsmosisPairData `json:"data"` - } - - // OsmosisPairData defines the data response structure for an Osmosis pair. - OsmosisPairData struct { - Base string `json:"base_symbol"` - Quote string `json:"quote_symbol"` - } -) - -func NewOsmosisProvider(endpoint Endpoint) *OsmosisProvider { - if endpoint.Name == ProviderOsmosis { - return &OsmosisProvider{ - baseURL: endpoint.Rest, - client: newDefaultHTTPClient(), - } - } - return &OsmosisProvider{ - baseURL: osmosisRestURL, - client: newDefaultHTTPClient(), - } -} - -func (p OsmosisProvider) GetTickerPrices(pairs ...types.CurrencyPair) (map[string]types.TickerPrice, error) { - path := fmt.Sprintf("%s%s/all", p.baseURL, osmosisTokenEndpoint) - - resp, err := p.client.Get(path) - if err != nil { - return nil, fmt.Errorf("failed to make Osmosis request: %w", err) - } - err = checkHTTPStatus(resp) - if err != nil { - return nil, err - } - - defer resp.Body.Close() - - bz, err := io.ReadAll(resp.Body) - if err != nil { - return nil, fmt.Errorf("failed to read Osmosis response body: %w", err) - } - - var tokensResp []OsmosisTokenResponse - if err := json.Unmarshal(bz, &tokensResp); err != nil { - return nil, fmt.Errorf("failed to unmarshal Osmosis response body: %w", err) - } - - baseDenomIdx := make(map[string]types.CurrencyPair) - for _, cp := range pairs { - baseDenomIdx[strings.ToUpper(cp.Base)] = cp - } - - tickerPrices := make(map[string]types.TickerPrice, len(pairs)) - for _, tr := range tokensResp { - symbol := strings.ToUpper(tr.Symbol) // symbol == base in a currency pair - - cp, ok := baseDenomIdx[symbol] - if !ok { - // skip tokens that are not requested - continue - } - - if _, ok := tickerPrices[symbol]; ok { - return nil, fmt.Errorf("duplicate token found in Osmosis response: %s", symbol) - } - - price, err := util.NewDecFromFloat(tr.Price) - if err != nil { - return nil, fmt.Errorf("failed to read Osmosis price (%f) for %s", tr.Price, symbol) - } - - volume, err := util.NewDecFromFloat(tr.Volume) - if err != nil { - return nil, fmt.Errorf("failed to read Osmosis volume (%f) for %s", tr.Volume, symbol) - } - - tickerPrices[cp.String()] = types.TickerPrice{Price: price, Volume: volume} - } - - for _, cp := range pairs { - if _, ok := tickerPrices[cp.String()]; !ok { - return nil, fmt.Errorf(types.ErrMissingExchangeRate.Error(), cp.String()) - } - } - - return tickerPrices, nil -} - -func (p OsmosisProvider) GetCandlePrices(pairs ...types.CurrencyPair) (map[string][]types.CandlePrice, error) { - candles := make(map[string][]types.CandlePrice) - for _, pair := range pairs { - if _, ok := candles[pair.Base]; !ok { - candles[pair.String()] = []types.CandlePrice{} - } - - path := fmt.Sprintf("%s%s/%s/chart?tf=5", p.baseURL, osmosisCandleEndpoint, pair.Base) - - resp, err := p.client.Get(path) - if err != nil { - return nil, fmt.Errorf("failed to make Osmosis request: %w", err) - } - err = checkHTTPStatus(resp) - if err != nil { - return nil, err - } - - defer resp.Body.Close() - - bz, err := io.ReadAll(resp.Body) - if err != nil { - return nil, fmt.Errorf("failed to read Osmosis response body: %w", err) - } - - var candlesResp []OsmosisCandleResponse - if err := json.Unmarshal(bz, &candlesResp); err != nil { - return nil, fmt.Errorf("failed to unmarshal Osmosis response body: %w", err) - } - - staleTime := PastUnixTime(providerCandlePeriod) - - candlePrices := []types.CandlePrice{} - for _, responseCandle := range candlesResp { - if staleTime >= responseCandle.Time { - continue - } - candlePrices = append(candlePrices, types.CandlePrice{ - Price: util.MustNewDecFromFloat(responseCandle.Close), - Volume: util.MustNewDecFromFloat(responseCandle.Volume), - // convert osmosis timestamp seconds -> milliseconds - TimeStamp: SecondsToMilli(responseCandle.Time), - }) - } - candles[pair.String()] = candlePrices - } - - return candles, nil -} - -// GetAvailablePairs return all available pairs symbol to susbscribe. -func (p OsmosisProvider) GetAvailablePairs() (map[string]struct{}, error) { - path := fmt.Sprintf("%s%s", p.baseURL, osmosisPairsEndpoint) - - resp, err := p.client.Get(path) - if err != nil { - return nil, err - } - err = checkHTTPStatus(resp) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - var pairsSummary OsmosisPairsSummary - if err := json.NewDecoder(resp.Body).Decode(&pairsSummary); err != nil { - return nil, err - } - - availablePairs := make(map[string]struct{}, len(pairsSummary.Data)) - for _, pair := range pairsSummary.Data { - cp := types.CurrencyPair{ - Base: strings.ToUpper(pair.Base), - Quote: strings.ToUpper(pair.Quote), - } - availablePairs[cp.String()] = struct{}{} - } - - return availablePairs, nil -} - -// SubscribeCurrencyPairs performs a no-op since osmosis does not use websockets -func (p OsmosisProvider) SubscribeCurrencyPairs(pairs ...types.CurrencyPair) error { - return nil -} diff --git a/price-feeder/oracle/provider/osmosis_test.go b/price-feeder/oracle/provider/osmosis_test.go deleted file mode 100644 index 3db791f4c..000000000 --- a/price-feeder/oracle/provider/osmosis_test.go +++ /dev/null @@ -1,195 +0,0 @@ -package provider - -import ( - "net/http" - "net/http/httptest" - "testing" - - "github.com/CosmosContracts/juno/price-feeder/oracle/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" -) - -func TestOsmosisProvider_GetTickerPrices(t *testing.T) { - p := NewOsmosisProvider(Endpoint{}) - - t.Run("valid_request_single_ticker", func(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { - require.Equal(t, "/tokens/v2/all", req.URL.String()) - //nolint:goconst - resp := `[ - { - "price": 100.22, - "denom": "ibc/0EF15DF2F02480ADE0BB6E85D9EBB5DAEA2836D3860E9F97F9AADE4F57A31AA0", - "symbol": "LUNA", - "liquidity": 56928301.60178607, - "volume_24h": 7047660.837452592, - "name": "Luna" - }, - { - "price": 28.52, - "denom": "ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2", - "symbol": "ATOM", - "liquidity": 189672157.83693966, - "volume_24h": 17006018.613512218, - "name": "Cosmos" - } - ] - ` - rw.Write([]byte(resp)) //nolint:errcheck - })) - defer server.Close() - - p.client = server.Client() - p.baseURL = server.URL - - prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "ATOM", Quote: "USDT"}) - require.NoError(t, err) - require.Len(t, prices, 1) - require.Equal(t, sdk.MustNewDecFromStr("28.52"), prices["ATOMUSDT"].Price) - require.Equal(t, sdk.MustNewDecFromStr("17006018.613512218"), prices["ATOMUSDT"].Volume) - }) - - t.Run("valid_request_multi_ticker", func(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { - require.Equal(t, "/tokens/v2/all", req.URL.String()) - resp := `[ - { - "price": 100.22, - "denom": "ibc/0EF15DF2F02480ADE0BB6E85D9EBB5DAEA2836D3860E9F97F9AADE4F57A31AA0", - "symbol": "LUNA", - "liquidity": 56928301.60178607, - "volume_24h": 7047660.837452592, - "name": "Luna" - }, - { - "price": 28.52, - "denom": "ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2", - "symbol": "ATOM", - "liquidity": 189672157.83693966, - "volume_24h": 17006018.613512218, - "name": "Cosmos" - } - ] - ` - rw.Write([]byte(resp)) //nolint:errcheck - })) - defer server.Close() - - p.client = server.Client() - p.baseURL = server.URL - - prices, err := p.GetTickerPrices( - types.CurrencyPair{Base: "ATOM", Quote: "USDT"}, - types.CurrencyPair{Base: "LUNA", Quote: "USDT"}, - ) - require.NoError(t, err) - require.Len(t, prices, 2) - require.Equal(t, sdk.MustNewDecFromStr("28.52"), prices["ATOMUSDT"].Price) - require.Equal(t, sdk.MustNewDecFromStr("17006018.613512218"), prices["ATOMUSDT"].Volume) - require.Equal(t, sdk.MustNewDecFromStr("100.22"), prices["LUNAUSDT"].Price) - require.Equal(t, sdk.MustNewDecFromStr("7047660.837452592"), prices["LUNAUSDT"].Volume) - }) - - t.Run("invalid_request_bad_response", func(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { - require.Equal(t, "/tokens/v2/all", req.URL.String()) - rw.Write([]byte(`FOO`)) //nolint:errcheck - })) - defer server.Close() - - p.client = server.Client() - p.baseURL = server.URL - - prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "ATOM", Quote: "USDT"}) - require.Error(t, err) - require.Nil(t, prices) - }) - - t.Run("invalid_request_invalid_ticker", func(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { - require.Equal(t, "/tokens/v2/all", req.URL.String()) - resp := `[ - { - "price": 100.22, - "denom": "ibc/0EF15DF2F02480ADE0BB6E85D9EBB5DAEA2836D3860E9F97F9AADE4F57A31AA0", - "symbol": "LUNA", - "liquidity": 56928301.60178607, - "volume_24h": 7047660.837452592, - "name": "Luna" - }, - { - "price": 28.52, - "denom": "ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2", - "symbol": "ATOM", - "liquidity": 189672157.83693966, - "volume_24h": 17006018.613512218, - "name": "Cosmos" - } - ] - ` - rw.Write([]byte(resp)) //nolint:errcheck - })) - defer server.Close() - - p.client = server.Client() - p.baseURL = server.URL - - prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "FOO", Quote: "BAR"}) - require.Error(t, err) - require.Nil(t, prices) - }) - - t.Run("check_redirect", func(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { - http.Redirect(rw, r, p.baseURL, http.StatusTemporaryRedirect) - })) - defer server.Close() - - server.Client().CheckRedirect = preventRedirect - p.client = server.Client() - p.baseURL = server.URL - - prices, err := p.GetTickerPrices(types.CurrencyPair{Base: "ATOM", Quote: "USDT"}) - require.Error(t, err) - require.Nil(t, prices) - }) -} - -func TestOsmosisProvider_GetAvailablePairs(t *testing.T) { - p := NewOsmosisProvider(Endpoint{}) - _, err := p.GetAvailablePairs() - require.NoError(t, err) - - t.Run("valid_available_pair", func(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { - require.Equal(t, "/pairs/v1/summary", req.URL.String()) - resp := `{ - "data": [ - { - "base_symbol": "ATOM", - "quote_symbol": "OSMO" - }, - { - "base_symbol": "ION", - "quote_symbol": "OSMO" - } - ] - }` - rw.Write([]byte(resp)) //nolint:errcheck - })) - defer server.Close() - - p.client = server.Client() - p.baseURL = server.URL - - availablePairs, err := p.GetAvailablePairs() - require.Nil(t, err) - - _, exist := availablePairs["ATOMOSMO"] - require.True(t, exist) - - _, exist = availablePairs["IONOSMO"] - require.True(t, exist) - }) -} diff --git a/price-feeder/oracle/provider/provider.go b/price-feeder/oracle/provider/provider.go deleted file mode 100644 index 10d466a9f..000000000 --- a/price-feeder/oracle/provider/provider.go +++ /dev/null @@ -1,116 +0,0 @@ -package provider - -import ( - "fmt" - "net/http" - "time" - - "github.com/CosmosContracts/juno/price-feeder/oracle/types" -) - -const ( - defaultTimeout = 10 * time.Second - defaultReadNewWSMessage = 50 * time.Millisecond - defaultMaxConnectionTime = time.Hour * 23 // should be < 24h - defaultReconnectTime = 2 * time.Minute - defaultPingDuration = 15 * time.Second - providerCandlePeriod = 10 * time.Minute - - ProviderKraken Name = "kraken" - ProviderBinance Name = "binance" - ProviderOsmosis Name = "osmosis" - ProviderJuno Name = "juno" - ProviderHuobi Name = "huobi" - ProviderOkx Name = "okx" - ProviderGate Name = "gate" - ProviderCoinbase Name = "coinbase" - ProviderBitget Name = "bitget" - ProviderMexc Name = "mexc" - ProviderCrypto Name = "crypto" - ProviderMock Name = "mock" -) - -var ping = []byte("ping") - -type ( - // Provider defines an interface an exchange price provider must implement. - Provider interface { - // GetTickerPrices returns the tickerPrices based on the provided pairs. - GetTickerPrices(...types.CurrencyPair) (map[string]types.TickerPrice, error) - - // GetCandlePrices returns the candlePrices based on the provided pairs. - GetCandlePrices(...types.CurrencyPair) (map[string][]types.CandlePrice, error) - - // GetAvailablePairs return all available pairs symbol to susbscribe. - GetAvailablePairs() (map[string]struct{}, error) - - // SubscribeCurrencyPairs subscribe to ticker and candle channels for all pairs. - SubscribeCurrencyPairs(...types.CurrencyPair) error - } - - // Name name of an oracle provider. Usually it is an exchange - // but this can be any provider name that can give token prices - // examples.: "binance", "osmosis", "kraken". - Name string - - // AggregatedProviderPrices defines a type alias for a map - // of provider -> asset -> TickerPrice - AggregatedProviderPrices map[Name]map[string]types.TickerPrice - - // AggregatedProviderCandles defines a type alias for a map - // of provider -> asset -> []types.CandlePrice - AggregatedProviderCandles map[Name]map[string][]types.CandlePrice - - // Endpoint defines an override setting in our config for the - // hardcoded rest and websocket api endpoints. - Endpoint struct { - // Name of the provider, ex. "binance" - Name Name `toml:"name"` - - // Rest endpoint for the provider, ex. "https://api1.binance.com" - Rest string `toml:"rest"` - - // Websocket endpoint for the provider, ex. "stream.binance.com:9443" - Websocket string `toml:"websocket"` - } -) - -// String cast provider name to string. -func (n Name) String() string { - return string(n) -} - -// preventRedirect avoid any redirect in the http.Client the request call -// will not return an error, but a valid response with redirect response code. -func preventRedirect(_ *http.Request, _ []*http.Request) error { - return http.ErrUseLastResponse -} - -func newDefaultHTTPClient() *http.Client { - return newHTTPClientWithTimeout(defaultTimeout) -} - -func newHTTPClientWithTimeout(timeout time.Duration) *http.Client { - return &http.Client{ - Timeout: timeout, - CheckRedirect: preventRedirect, - } -} - -// PastUnixTime returns a millisecond timestamp that represents the unix time -// minus t. -func PastUnixTime(t time.Duration) int64 { - return time.Now().Add(t*-1).Unix() * int64(time.Second/time.Millisecond) -} - -// SecondsToMilli converts seconds to milliseconds for our unix timestamps. -func SecondsToMilli(t int64) int64 { - return t * int64(time.Second/time.Millisecond) -} - -func checkHTTPStatus(resp *http.Response) error { - if resp.StatusCode != http.StatusOK { - return fmt.Errorf("unexpected status: %s", resp.Status) - } - return nil -} diff --git a/price-feeder/oracle/provider/telemetry.go b/price-feeder/oracle/provider/telemetry.go deleted file mode 100644 index b01ea3462..000000000 --- a/price-feeder/oracle/provider/telemetry.go +++ /dev/null @@ -1,99 +0,0 @@ -package provider - -import ( - "github.com/armon/go-metrics" - "github.com/cosmos/cosmos-sdk/telemetry" -) - -const ( - MessageTypeCandle = MessageType("candle") - MessageTypeTicker = MessageType("ticker") - MessageTypeTrade = MessageType("trade") -) - -type ( - MessageType string -) - -// String cast provider MessageType to string. -func (mt MessageType) String() string { - return string(mt) -} - -// providerLabel returns a label based on the provider name. -func providerLabel(n Name) metrics.Label { - return metrics.Label{ - Name: "provider", - Value: n.String(), - } -} - -// messageTypeLabel returns a label based on the message type. -func messageTypeLabel(mt MessageType) metrics.Label { - return metrics.Label{ - Name: "type", - Value: mt.String(), - } -} - -// telemetryWebsocketReconnect gives an standard way to add -// `price_feeder_websocket_reconnect` metric. -func telemetryWebsocketReconnect(n Name) { - telemetry.IncrCounterWithLabels( - []string{ - "websocket", - "reconnect", - }, - 1, - []metrics.Label{ - providerLabel(n), - }, - ) -} - -// telemetryWebsocketSubscribeCurrencyPairs gives an standard way to add -// `price_feeder_websocket_subscribe_currency_pairs{provider="x"}` metric. -func telemetryWebsocketSubscribeCurrencyPairs(n Name, incr int) { - telemetry.IncrCounterWithLabels( - []string{ - "websocket", - "subscribe", - "currency_pairs", - }, - float32(incr), - []metrics.Label{ - providerLabel(n), - }, - ) -} - -// telemetryWebsocketMessage gives an standard way to add -// `price_feeder_websocket_message{type="x", provider="x"}` metric. -func telemetryWebsocketMessage(n Name, mt MessageType) { - telemetry.IncrCounterWithLabels( - []string{ - "websocket", - "message", - }, - 1, - []metrics.Label{ - providerLabel(n), - messageTypeLabel(mt), - }, - ) -} - -// TelemetryFailure gives an standard way to add -// `price_feeder_failure_provider{type="x", provider="x"}` metric. -func TelemetryFailure(n Name, mt MessageType) { - telemetry.IncrCounterWithLabels( - []string{ - "failure", - }, - 1, - []metrics.Label{ - providerLabel(n), - messageTypeLabel(mt), - }, - ) -} diff --git a/price-feeder/oracle/provider/websocket_controller.go b/price-feeder/oracle/provider/websocket_controller.go deleted file mode 100644 index 516694315..000000000 --- a/price-feeder/oracle/provider/websocket_controller.go +++ /dev/null @@ -1,195 +0,0 @@ -package provider - -import ( - "context" - "fmt" - "net/url" - "sync" - "time" - - "github.com/CosmosContracts/juno/price-feeder/oracle/types" - "github.com/gorilla/websocket" - "github.com/rs/zerolog" -) - -type ( - MessageHandler func(int, []byte) - - // WebsocketController defines a provider agnostic websocket handler - // that manages reconnecting, subscribing, and receiving messages - WebsocketController struct { - ctx context.Context - providerName Name - websocketURL url.URL - subscriptionMsgs []interface{} - messageHandler MessageHandler - logger zerolog.Logger - - mtx sync.Mutex - client *websocket.Conn - } -) - -// NewWebsocketController does nothing except initialize a new WebsocketController -// and provider a reminder for what fields need to be passed in. -func NewWebsocketController( - ctx context.Context, - providerName Name, - websocketURL url.URL, - subscriptionMsgs []interface{}, - messageHandler MessageHandler, - logger zerolog.Logger, -) *WebsocketController { - return &WebsocketController{ - ctx: ctx, - providerName: providerName, - websocketURL: websocketURL, - subscriptionMsgs: subscriptionMsgs, - messageHandler: messageHandler, - logger: logger, - } -} - -// Start will continuously loop and attempt connecting to the websocket -// until a successful connection is made. It then starts the ping -// service and read listener in new go routines and sends subscription -// messages using the passed in subscription messages -func (wsc *WebsocketController) Start() { - connectTicker := time.NewTicker(defaultReconnectTime) - defer connectTicker.Stop() - - for { - if err := wsc.connect(); err != nil { - wsc.logger.Err(err).Send() - select { - case <-wsc.ctx.Done(): - return - case <-connectTicker.C: - continue - } - } - - go wsc.readWebSocket() - go wsc.ping() - - if err := wsc.subscribe(); err != nil { - wsc.logger.Err(err).Send() - wsc.close() - continue - } - return - } -} - -// connect dials the websocket and sets the client to the established connection -func (wsc *WebsocketController) connect() error { - wsc.mtx.Lock() - defer wsc.mtx.Unlock() - - wsc.logger.Debug().Msg("connecting to websocket") - conn, resp, err := websocket.DefaultDialer.Dial(wsc.websocketURL.String(), nil) - defer resp.Body.Close() - if err != nil { - return fmt.Errorf(types.ErrWebsocketDial.Error(), wsc.providerName, err) - } - wsc.client = conn - return nil -} - -// subscribe sends the WebsocketControllers subscription messages to the websocket -func (wsc *WebsocketController) subscribe() error { - wsc.mtx.Lock() - defer wsc.mtx.Unlock() - - for _, jsonMessage := range wsc.subscriptionMsgs { - wsc.logger.Debug().Interface("msg", jsonMessage).Msg("sending websocket message") - if err := wsc.client.WriteJSON(jsonMessage); err != nil { - return fmt.Errorf(types.ErrWebsocketSend.Error(), wsc.providerName, err) - } - } - return nil -} - -// ping sends a ping to the server every defaultPingDuration -func (wsc *WebsocketController) ping() { - pingTicker := time.NewTicker(defaultPingDuration) - defer pingTicker.Stop() - - for { - if wsc.client == nil { - return - } - wsc.logger.Debug().Msg("ping") - wsc.mtx.Lock() - err := wsc.client.WriteMessage(1, []byte("ping")) - wsc.mtx.Unlock() - if err != nil { - wsc.logger.Err(fmt.Errorf(types.ErrWebsocketSend.Error(), wsc.providerName, err)).Send() - } - select { - case <-wsc.ctx.Done(): - return - case <-pingTicker.C: - continue - } - } -} - -// readWebSocket contiously reads from the websocket and relays messages -// to the passed in messageHandler. On websocket error this function -// terminates and starts the reconnect process -func (wsc *WebsocketController) readWebSocket() { - reconnectTicker := time.NewTicker(defaultMaxConnectionTime) - defer reconnectTicker.Stop() - - for { - select { - case <-wsc.ctx.Done(): - wsc.close() - return - case <-time.After(defaultReadNewWSMessage): - messageType, bz, err := wsc.client.ReadMessage() - if err != nil { - wsc.logger.Err(fmt.Errorf(types.ErrWebsocketRead.Error(), wsc.providerName, err)).Send() - wsc.reconnect() - return - } - wsc.readSuccess(messageType, bz) - case <-reconnectTicker.C: - wsc.reconnect() - return - } - } -} - -func (wsc *WebsocketController) readSuccess(messageType int, bz []byte) { - wsc.logger.Debug().Msg(fmt.Sprintf("%d: %s", messageType, string(bz))) - - if messageType != websocket.TextMessage || len(bz) == 0 { - return - } - if string(bz) == "pong" { - wsc.client.PongHandler() - return - } - wsc.messageHandler(messageType, bz) -} - -// close sends a close message to the websocket and sets the client to nil -func (wsc *WebsocketController) close() { - wsc.mtx.Lock() - defer wsc.mtx.Unlock() - - wsc.logger.Debug().Msg("closing websocket") - if err := wsc.client.Close(); err != nil { - wsc.logger.Err(fmt.Errorf(types.ErrWebsocketClose.Error(), wsc.providerName, err)).Send() - } - wsc.client = nil -} - -// reconnect closes the current websocket and starts a new connection process -func (wsc *WebsocketController) reconnect() { - wsc.close() - go wsc.Start() - telemetryWebsocketReconnect(wsc.providerName) -} diff --git a/price-feeder/oracle/provider/websocket_controller_test.go b/price-feeder/oracle/provider/websocket_controller_test.go deleted file mode 100644 index 1b9ed4838..000000000 --- a/price-feeder/oracle/provider/websocket_controller_test.go +++ /dev/null @@ -1,64 +0,0 @@ -package provider - -import ( - "testing" - - "github.com/gorilla/websocket" - "github.com/stretchr/testify/require" -) - -type TestProvider struct { - handlerCalled bool -} - -func (mp *TestProvider) messageHandler(messageType int, bz []byte) { - mp.handlerCalled = true -} - -func TestWebsocketController_readSuccess(t *testing.T) { - testCases := []struct { - name string - messageType int - bz []byte - shouldCallMessageHandler bool - }{ - { - "messageType is not a TextMessage", - 8, - []byte("asdf"), - false, - }, - { - "messasge length is zero", - 1, - []byte{}, - false, - }, - { - "message is a pong", - 1, - []byte("pong"), - false, - }, - { - "is a valid message for the messageHandler", - 1, - []byte("asdf"), - true, - }, - } - - for _, testCase := range testCases { - t.Run(testCase.name, func(t *testing.T) { - provider := TestProvider{} - mockClient := new(websocket.Conn) - c := &WebsocketController{ - providerName: ProviderMock, - messageHandler: provider.messageHandler, - client: mockClient, - } - c.readSuccess(testCase.messageType, testCase.bz) - require.Equal(t, provider.handlerCalled, testCase.shouldCallMessageHandler) - }) - } -} diff --git a/price-feeder/oracle/types/candle_price.go b/price-feeder/oracle/types/candle_price.go deleted file mode 100644 index f00eb95dd..000000000 --- a/price-feeder/oracle/types/candle_price.go +++ /dev/null @@ -1,29 +0,0 @@ -package types - -import ( - "fmt" - - sdk "github.com/cosmos/cosmos-sdk/types" -) - -// CandlePrice defines price, volume, and time information for an exchange rate. -type CandlePrice struct { - Price sdk.Dec // last trade price - Volume sdk.Dec // volume - TimeStamp int64 // timestamp -} - -// NewCandlePrice parses the lastPrice and volume to a decimal and returns a CandlePrice -func NewCandlePrice(provider, symbol, lastPrice, volume string, timeStamp int64) (CandlePrice, error) { - price, err := sdk.NewDecFromStr(lastPrice) - if err != nil { - return CandlePrice{}, fmt.Errorf("failed to parse %s price (%s) for %s: %w", provider, lastPrice, symbol, err) - } - - volumeDec, err := sdk.NewDecFromStr(volume) - if err != nil { - return CandlePrice{}, fmt.Errorf("failed to parse %s volume (%s) for %s: %w", provider, volume, symbol, err) - } - - return CandlePrice{Price: price, Volume: volumeDec, TimeStamp: timeStamp}, nil -} diff --git a/price-feeder/oracle/types/candle_price_test.go b/price-feeder/oracle/types/candle_price_test.go deleted file mode 100644 index b7bcb75ba..000000000 --- a/price-feeder/oracle/types/candle_price_test.go +++ /dev/null @@ -1,37 +0,0 @@ -package types - -import ( - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" -) - -func TestNewCandlePrice(t *testing.T) { - price := "105473.43" - volume := "48394" - timeStamp := int64(1257894000) - - t.Run("when the inputs are valid", func(t *testing.T) { - candlePrice, err := NewCandlePrice("binance", "BTC", price, volume, timeStamp) - require.Nil(t, err, "expected the returned error to be nil") - - parsedPrice, _ := sdk.NewDecFromStr(price) - require.Equal(t, candlePrice.Price, parsedPrice) - - parsedVolume, _ := sdk.NewDecFromStr(volume) - require.Equal(t, candlePrice.Volume, parsedVolume) - - require.Equal(t, candlePrice.TimeStamp, timeStamp) - }) - - t.Run("when the lastPrice input is invalid", func(t *testing.T) { - _, err := NewCandlePrice("binance", "BTC", "bad_price", volume, timeStamp) - require.NotNil(t, err, "expected the returned error to not be nil") - }) - - t.Run("when the volume input is invalid", func(t *testing.T) { - _, err := NewCandlePrice("binance", "BTC", price, "bad_volume", timeStamp) - require.NotNil(t, err, "expected the returned error to not be nil") - }) -} diff --git a/price-feeder/oracle/types/currency.go b/price-feeder/oracle/types/currency.go deleted file mode 100644 index ad332520e..000000000 --- a/price-feeder/oracle/types/currency.go +++ /dev/null @@ -1,28 +0,0 @@ -package types - -// CurrencyPair defines a currency exchange pair consisting of a base and a quote. -// We primarily utilize the base for broadcasting exchange rates and use the -// pair for querying for the ticker prices. -type CurrencyPair struct { - Base string - Quote string -} - -// String implements the Stringer interface and defines a ticker symbol for -// querying the exchange rate. -func (cp CurrencyPair) String() string { - return cp.Base + cp.Quote -} - -// MapPairsToSlice returns the map of currency pairs as slice. -func MapPairsToSlice(mapPairs map[string]CurrencyPair) []CurrencyPair { - currencyPairs := make([]CurrencyPair, len(mapPairs)) - - iterator := 0 - for _, cp := range mapPairs { - currencyPairs[iterator] = cp - iterator++ - } - - return currencyPairs -} diff --git a/price-feeder/oracle/types/errors.go b/price-feeder/oracle/types/errors.go deleted file mode 100644 index 20b55046f..000000000 --- a/price-feeder/oracle/types/errors.go +++ /dev/null @@ -1,20 +0,0 @@ -package types - -import ( - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" -) - -const ModuleName = "price-feeder" - -// Price feeder errors -var ( - ErrProviderConnection = sdkerrors.Register(ModuleName, 1, "provider connection") - ErrMissingExchangeRate = sdkerrors.Register(ModuleName, 2, "missing exchange rate for %s") - ErrTickerNotFound = sdkerrors.Register(ModuleName, 3, "%s failed to get ticker price for %s") - ErrCandleNotFound = sdkerrors.Register(ModuleName, 4, "%s failed to get candle price for %s") - - ErrWebsocketDial = sdkerrors.Register(ModuleName, 5, "error connecting to %s websocket: %w") - ErrWebsocketClose = sdkerrors.Register(ModuleName, 6, "error closing %s websocket: %w") - ErrWebsocketSend = sdkerrors.Register(ModuleName, 7, "error sending to %s websocket: %w") - ErrWebsocketRead = sdkerrors.Register(ModuleName, 8, "error reading from %s websocket: %w") -) diff --git a/price-feeder/oracle/types/ticker_price.go b/price-feeder/oracle/types/ticker_price.go deleted file mode 100644 index 2ed5e132f..000000000 --- a/price-feeder/oracle/types/ticker_price.go +++ /dev/null @@ -1,28 +0,0 @@ -package types - -import ( - "fmt" - - sdk "github.com/cosmos/cosmos-sdk/types" -) - -// TickerPrice defines price and volume information for a symbol or ticker exchange rate. -type TickerPrice struct { - Price sdk.Dec // last trade price - Volume sdk.Dec // 24h volume -} - -// NewTickerPrice parses the lastPrice and volume to a decimal and returns a TickerPrice -func NewTickerPrice(provider, symbol, lastPrice, volume string) (TickerPrice, error) { - price, err := sdk.NewDecFromStr(lastPrice) - if err != nil { - return TickerPrice{}, fmt.Errorf("failed to parse %s price (%s) for %s: %w", provider, lastPrice, symbol, err) - } - - volumeDec, err := sdk.NewDecFromStr(volume) - if err != nil { - return TickerPrice{}, fmt.Errorf("failed to parse %s volume (%s) for %s: %w", provider, volume, symbol, err) - } - - return TickerPrice{Price: price, Volume: volumeDec}, nil -} diff --git a/price-feeder/oracle/types/ticker_price_test.go b/price-feeder/oracle/types/ticker_price_test.go deleted file mode 100644 index a0e6d610c..000000000 --- a/price-feeder/oracle/types/ticker_price_test.go +++ /dev/null @@ -1,34 +0,0 @@ -package types - -import ( - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" -) - -func TestNewTicketPrice(t *testing.T) { - price := "105473.43" - volume := "48394" - - t.Run("when the inputs are valid", func(t *testing.T) { - tickerPrice, err := NewTickerPrice("binance", "BTC", price, volume) - require.Nil(t, err, "expected the returned error to be nil") - - parsedPrice, _ := sdk.NewDecFromStr(price) - require.Equal(t, tickerPrice.Price, parsedPrice) - - parsedVolume, _ := sdk.NewDecFromStr(volume) - require.Equal(t, tickerPrice.Volume, parsedVolume) - }) - - t.Run("when the lastPrice input is invalid", func(t *testing.T) { - _, err := NewTickerPrice("binance", "BTC", "bad_price", volume) - require.NotNil(t, err, "expected the returned error to not be nil") - }) - - t.Run("when the volume input is invalid", func(t *testing.T) { - _, err := NewTickerPrice("binance", "BTC", price, "bad_volume") - require.NotNil(t, err, "expected the returned error to not be nil") - }) -} diff --git a/price-feeder/oracle/util.go b/price-feeder/oracle/util.go deleted file mode 100644 index 35f2bbdca..000000000 --- a/price-feeder/oracle/util.go +++ /dev/null @@ -1,214 +0,0 @@ -package oracle - -import ( - "fmt" - "sort" - "time" - - "github.com/CosmosContracts/juno/price-feeder/oracle/provider" - sdk "github.com/cosmos/cosmos-sdk/types" -) - -var minimumTimeWeight = sdk.MustNewDecFromStr("0.2") - -const ( - // tvwapCandlePeriod represents the time period we use for tvwap in minutes - tvwapCandlePeriod = 5 * time.Minute -) - -// compute VWAP for each base by dividing the Σ {P * V} by Σ {V} -func vwap(weightedPrices, volumeSum map[string]sdk.Dec) map[string]sdk.Dec { - vwap := make(map[string]sdk.Dec) - - for base, p := range weightedPrices { - if !volumeSum[base].Equal(sdk.ZeroDec()) { - if _, ok := vwap[base]; !ok { - vwap[base] = sdk.ZeroDec() - } - - vwap[base] = p.Quo(volumeSum[base]) - } - } - - return vwap -} - -// ComputeVWAP computes the volume weighted average price for all price points -// for each ticker/exchange pair. The provided prices argument reflects a mapping -// of provider => { => , ...}. -// -// Ref: https://en.wikipedia.org/wiki/Volume-weighted_average_price -func ComputeVWAP(prices provider.AggregatedProviderPrices) map[string]sdk.Dec { - var ( - weightedPrices = make(map[string]sdk.Dec) - volumeSum = make(map[string]sdk.Dec) - ) - - for _, providerPrices := range prices { - for base, tp := range providerPrices { - if _, ok := weightedPrices[base]; !ok { - weightedPrices[base] = sdk.ZeroDec() - } - if _, ok := volumeSum[base]; !ok { - volumeSum[base] = sdk.ZeroDec() - } - - // weightedPrices[base] = Σ {P * V} for all TickerPrice - weightedPrices[base] = weightedPrices[base].Add(tp.Price.Mul(tp.Volume)) - - // track total volume for each base - volumeSum[base] = volumeSum[base].Add(tp.Volume) - } - } - - return vwap(weightedPrices, volumeSum) -} - -// ComputeTVWAP computes the time volume weighted average price for all points -// for each exchange pair. Filters out any candles that did not occur within -// timePeriod. The provided prices argument reflects a mapping of -// provider => { => , ...}. -// -// Ref : https://en.wikipedia.org/wiki/Time-weighted_average_price -func ComputeTVWAP(prices provider.AggregatedProviderCandles) (map[string]sdk.Dec, error) { - var ( - weightedPrices = make(map[string]sdk.Dec) - volumeSum = make(map[string]sdk.Dec) - now = provider.PastUnixTime(0) - timePeriod = provider.PastUnixTime(tvwapCandlePeriod) - ) - - for _, providerPrices := range prices { - for base := range providerPrices { - cp := providerPrices[base] - if len(cp) == 0 { - continue - } - - if _, ok := weightedPrices[base]; !ok { - weightedPrices[base] = sdk.ZeroDec() - } - if _, ok := volumeSum[base]; !ok { - volumeSum[base] = sdk.ZeroDec() - } - - // Sort by timestamp old -> new - sort.SliceStable(cp, func(i, j int) bool { - return cp[i].TimeStamp < cp[j].TimeStamp - }) - - period := sdk.NewDec(now - cp[0].TimeStamp) - if period.Equal(sdk.ZeroDec()) { - return nil, fmt.Errorf("unable to divide by zero") - } - // weightUnit = (1 - minimumTimeWeight) / period - weightUnit := sdk.OneDec().Sub(minimumTimeWeight).Quo(period) - - // get weighted prices, and sum of volumes - for _, candle := range cp { - // we only want candles within the last timePeriod - if timePeriod < candle.TimeStamp { - // timeDiff = now - candle.TimeStamp - timeDiff := sdk.NewDec(now - candle.TimeStamp) - // volume = candle.Volume * (weightUnit * (period - timeDiff) + minimumTimeWeight) - volume := candle.Volume.Mul( - weightUnit.Mul(period.Sub(timeDiff).Add(minimumTimeWeight)), - ) - volumeSum[base] = volumeSum[base].Add(volume) - weightedPrices[base] = weightedPrices[base].Add(candle.Price.Mul(volume)) - } - } - - } - } - - return vwap(weightedPrices, volumeSum), nil -} - -// StandardDeviation returns maps of the standard deviations and means of assets. -// Will skip calculating for an asset if there are less than 3 prices. -func StandardDeviation( - prices map[provider.Name]map[string]sdk.Dec, -) (map[string]sdk.Dec, map[string]sdk.Dec, error) { - var ( - deviations = make(map[string]sdk.Dec) - means = make(map[string]sdk.Dec) - priceSlice = make(map[string][]sdk.Dec) - priceSums = make(map[string]sdk.Dec) - ) - - for _, providerPrices := range prices { - for base, p := range providerPrices { - if _, ok := priceSums[base]; !ok { - priceSums[base] = sdk.ZeroDec() - } - if _, ok := priceSlice[base]; !ok { - priceSlice[base] = []sdk.Dec{} - } - - priceSums[base] = priceSums[base].Add(p) - priceSlice[base] = append(priceSlice[base], p) - } - } - - for base, sum := range priceSums { - // Skip if standard deviation would not be meaningful - if len(priceSlice[base]) < 3 { - continue - } - if _, ok := deviations[base]; !ok { - deviations[base] = sdk.ZeroDec() - } - if _, ok := means[base]; !ok { - means[base] = sdk.ZeroDec() - } - - numPrices := int64(len(priceSlice[base])) - means[base] = sum.QuoInt64(numPrices) - varianceSum := sdk.ZeroDec() - - for _, price := range priceSlice[base] { - deviation := price.Sub(means[base]) - varianceSum = varianceSum.Add(deviation.Mul(deviation)) - } - - variance := varianceSum.QuoInt64(numPrices) - - standardDeviation, err := variance.ApproxSqrt() - if err != nil { - return make(map[string]sdk.Dec), make(map[string]sdk.Dec), err - } - - deviations[base] = standardDeviation - } - - return deviations, means, nil -} - -// ComputeTvwapsByProvider computes the tvwap prices from candles for each provider separately and returns them -// in a map separated by provider name -func ComputeTvwapsByProvider(prices provider.AggregatedProviderCandles) (map[provider.Name]map[string]sdk.Dec, error) { - tvwaps := make(map[provider.Name]map[string]sdk.Dec) - var err error - - for providerName, candles := range prices { - singleProviderCandles := provider.AggregatedProviderCandles{"providerName": candles} - tvwaps[providerName], err = ComputeTVWAP(singleProviderCandles) - if err != nil { - return nil, err - } - } - return tvwaps, nil -} - -// ComputeVwapsByProvider computes the vwap prices from tickers for each provider separately and returns them -// in a map separated by provider name -func ComputeVwapsByProvider(prices provider.AggregatedProviderPrices) map[provider.Name]map[string]sdk.Dec { - vwaps := make(map[provider.Name]map[string]sdk.Dec) - - for providerName, tickers := range prices { - singleProviderCandles := provider.AggregatedProviderPrices{"providerName": tickers} - vwaps[providerName] = ComputeVWAP(singleProviderCandles) - } - return vwaps -} diff --git a/price-feeder/oracle/util/coins.go b/price-feeder/oracle/util/coins.go deleted file mode 100644 index 7799af372..000000000 --- a/price-feeder/oracle/util/coins.go +++ /dev/null @@ -1,15 +0,0 @@ -package util - -import ( - "strconv" - - sdk "github.com/cosmos/cosmos-sdk/types" -) - -func NewDecFromFloat(f float64) (sdk.Dec, error) { - return sdk.NewDecFromStr(strconv.FormatFloat(f, 'f', -1, 64)) -} - -func MustNewDecFromFloat(f float64) sdk.Dec { - return sdk.MustNewDecFromStr(strconv.FormatFloat(f, 'f', -1, 64)) -} diff --git a/price-feeder/oracle/util_test.go b/price-feeder/oracle/util_test.go deleted file mode 100644 index 70d2b5300..000000000 --- a/price-feeder/oracle/util_test.go +++ /dev/null @@ -1,369 +0,0 @@ -package oracle_test - -import ( - "testing" - "time" - - "github.com/CosmosContracts/juno/price-feeder/oracle" - "github.com/CosmosContracts/juno/price-feeder/oracle/provider" - "github.com/CosmosContracts/juno/price-feeder/oracle/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" -) - -func TestComputeVWAP(t *testing.T) { - testCases := map[string]struct { - prices map[provider.Name]map[string]types.TickerPrice - expected map[string]sdk.Dec - }{ - "empty prices": { - prices: make(map[provider.Name]map[string]types.TickerPrice), - expected: make(map[string]sdk.Dec), - }, - "nil prices": { - prices: nil, - expected: make(map[string]sdk.Dec), - }, - "valid prices": { - prices: map[provider.Name]map[string]types.TickerPrice{ - provider.ProviderBinance: { - "ATOM": types.TickerPrice{ - Price: sdk.MustNewDecFromStr("28.21000000"), - Volume: sdk.MustNewDecFromStr("2749102.78000000"), - }, - "UMEE": types.TickerPrice{ - Price: sdk.MustNewDecFromStr("1.13000000"), - Volume: sdk.MustNewDecFromStr("249102.38000000"), - }, - "LUNA": types.TickerPrice{ - Price: sdk.MustNewDecFromStr("64.87000000"), - Volume: sdk.MustNewDecFromStr("7854934.69000000"), - }, - }, - provider.ProviderKraken: { - "ATOM": types.TickerPrice{ - Price: sdk.MustNewDecFromStr("28.268700"), - Volume: sdk.MustNewDecFromStr("178277.53314385"), - }, - "LUNA": types.TickerPrice{ - Price: sdk.MustNewDecFromStr("64.87853000"), - Volume: sdk.MustNewDecFromStr("458917.46353577"), - }, - }, - "FOO": { - "ATOM": types.TickerPrice{ - Price: sdk.MustNewDecFromStr("28.168700"), - Volume: sdk.MustNewDecFromStr("4749102.53314385"), - }, - }, - }, - expected: map[string]sdk.Dec{ - "ATOM": sdk.MustNewDecFromStr("28.185812745610043621"), - "UMEE": sdk.MustNewDecFromStr("1.13000000"), - "LUNA": sdk.MustNewDecFromStr("64.870470848638112395"), - }, - }, - } - - for name, tc := range testCases { - tc := tc - - t.Run(name, func(t *testing.T) { - vwap := oracle.ComputeVWAP(tc.prices) - require.Len(t, vwap, len(tc.expected)) - - for k, v := range tc.expected { - require.Equalf(t, v, vwap[k], "unexpected VWAP for %s", k) - } - }) - } -} - -func TestComputeTVWAP(t *testing.T) { - testCases := map[string]struct { - candles provider.AggregatedProviderCandles - expected map[string]sdk.Dec - }{ - "empty prices": { - candles: make(provider.AggregatedProviderCandles), - expected: make(map[string]sdk.Dec), - }, - "nil prices": { - candles: nil, - expected: make(map[string]sdk.Dec), - }, - "valid prices": { - candles: map[provider.Name]map[string][]types.CandlePrice{ - provider.ProviderBinance: { - "ATOM": []types.CandlePrice{ - { - Price: sdk.MustNewDecFromStr("25.09183"), - Volume: sdk.MustNewDecFromStr("98444.123455"), - TimeStamp: provider.PastUnixTime(1 * time.Minute), - }, - }, - }, - provider.ProviderKraken: { - "ATOM": []types.CandlePrice{ - { - Price: sdk.MustNewDecFromStr("28.268700"), - Volume: sdk.MustNewDecFromStr("178277.53314385"), - TimeStamp: provider.PastUnixTime(2 * time.Minute), - }, - }, - "UMEE": []types.CandlePrice{ - { - Price: sdk.MustNewDecFromStr("1.13000000"), - Volume: sdk.MustNewDecFromStr("178277.53314385"), - TimeStamp: provider.PastUnixTime(2 * time.Minute), - }, - }, - "LUNA": []types.CandlePrice{ - { - Price: sdk.MustNewDecFromStr("64.87853000"), - Volume: sdk.MustNewDecFromStr("458917.46353577"), - TimeStamp: provider.PastUnixTime(1 * time.Minute), - }, - }, - }, - "FOO": { - "ATOM": []types.CandlePrice{ - { - Price: sdk.MustNewDecFromStr("28.168700"), - Volume: sdk.MustNewDecFromStr("4749102.53314385"), - TimeStamp: provider.PastUnixTime(130 * time.Second), - }, - }, - }, - }, - expected: map[string]sdk.Dec{ - "ATOM": sdk.MustNewDecFromStr("28.045149332478338614"), - "UMEE": sdk.MustNewDecFromStr("1.13000000"), - "LUNA": sdk.MustNewDecFromStr("64.878530000000000000"), - }, - }, - "one expired price": { - candles: map[provider.Name]map[string][]types.CandlePrice{ - provider.ProviderBinance: { - "ATOM": []types.CandlePrice{ - { - Price: sdk.MustNewDecFromStr("25.09183"), - Volume: sdk.MustNewDecFromStr("98444.123455"), - TimeStamp: provider.PastUnixTime(1 * time.Minute), - }, - }, - }, - provider.ProviderKraken: { - "ATOM": []types.CandlePrice{ - { - Price: sdk.MustNewDecFromStr("28.268700"), - Volume: sdk.MustNewDecFromStr("178277.53314385"), - TimeStamp: provider.PastUnixTime(2 * time.Minute), - }, - }, - "UMEE": []types.CandlePrice{ - { - Price: sdk.MustNewDecFromStr("1.13000000"), - Volume: sdk.MustNewDecFromStr("178277.53314385"), - TimeStamp: provider.PastUnixTime(2 * time.Minute), - }, - }, - "LUNA": []types.CandlePrice{ - { - Price: sdk.MustNewDecFromStr("64.87853000"), - Volume: sdk.MustNewDecFromStr("458917.46353577"), - TimeStamp: provider.PastUnixTime(1 * time.Minute), - }, - }, - }, - "FOO": { - "ATOM": []types.CandlePrice{ - { - Price: sdk.MustNewDecFromStr("28.168700"), - Volume: sdk.MustNewDecFromStr("4749102.53314385"), - TimeStamp: provider.PastUnixTime(5 * time.Minute), - }, - }, - }, - }, - expected: map[string]sdk.Dec{ - "ATOM": sdk.MustNewDecFromStr("26.601468076898424151"), - "UMEE": sdk.MustNewDecFromStr("1.13000000"), - "LUNA": sdk.MustNewDecFromStr("64.878530000000000000"), - }, - }, - "all expired prices": { - candles: map[provider.Name]map[string][]types.CandlePrice{ - provider.ProviderBinance: { - "ATOM": []types.CandlePrice{ - { - Price: sdk.MustNewDecFromStr("25.09183"), - Volume: sdk.MustNewDecFromStr("98444.123455"), - TimeStamp: provider.PastUnixTime(5 * time.Minute), - }, - }, - }, - provider.ProviderKraken: { - "ATOM": []types.CandlePrice{ - { - Price: sdk.MustNewDecFromStr("28.268700"), - Volume: sdk.MustNewDecFromStr("178277.53314385"), - TimeStamp: provider.PastUnixTime(5 * time.Minute), - }, - }, - "UMEE": []types.CandlePrice{ - { - Price: sdk.MustNewDecFromStr("1.13000000"), - Volume: sdk.MustNewDecFromStr("178277.53314385"), - TimeStamp: provider.PastUnixTime(5 * time.Minute), - }, - }, - "LUNA": []types.CandlePrice{ - { - Price: sdk.MustNewDecFromStr("64.87853000"), - Volume: sdk.MustNewDecFromStr("458917.46353577"), - TimeStamp: provider.PastUnixTime(5 * time.Minute), - }, - }, - }, - "FOO": { - "ATOM": []types.CandlePrice{ - { - Price: sdk.MustNewDecFromStr("28.168700"), - Volume: sdk.MustNewDecFromStr("4749102.53314385"), - TimeStamp: provider.PastUnixTime(5 * time.Minute), - }, - }, - }, - }, - expected: map[string]sdk.Dec{}, - }, - } - - for name, tc := range testCases { - tc := tc - - t.Run(name, func(t *testing.T) { - vwap, err := oracle.ComputeTVWAP(tc.candles) - require.NoError(t, err) - require.Len(t, vwap, len(tc.expected)) - - for k, v := range tc.expected { - require.Equalf(t, v, vwap[k], "unexpected VWAP for %s", k) - } - }) - } -} - -func TestStandardDeviation(t *testing.T) { - type deviation struct { - mean sdk.Dec - deviation sdk.Dec - } - testCases := map[string]struct { - prices map[provider.Name]map[string]sdk.Dec - expected map[string]deviation - }{ - "empty prices": { - prices: make(map[provider.Name]map[string]sdk.Dec), - expected: map[string]deviation{}, - }, - "nil prices": { - prices: nil, - expected: map[string]deviation{}, - }, - "not enough prices": { - prices: map[provider.Name]map[string]sdk.Dec{ - provider.ProviderBinance: { - "ATOM": sdk.MustNewDecFromStr("28.21000000"), - "UMEE": sdk.MustNewDecFromStr("1.13000000"), - "LUNA": sdk.MustNewDecFromStr("64.87000000"), - }, - provider.ProviderKraken: { - "ATOM": sdk.MustNewDecFromStr("28.23000000"), - "UMEE": sdk.MustNewDecFromStr("1.13050000"), - "LUNA": sdk.MustNewDecFromStr("64.85000000"), - }, - }, - expected: map[string]deviation{}, - }, - "some prices": { - prices: map[provider.Name]map[string]sdk.Dec{ - provider.ProviderBinance: { - "ATOM": sdk.MustNewDecFromStr("28.21000000"), - "UMEE": sdk.MustNewDecFromStr("1.13000000"), - "LUNA": sdk.MustNewDecFromStr("64.87000000"), - }, - provider.ProviderKraken: { - "ATOM": sdk.MustNewDecFromStr("28.23000000"), - "UMEE": sdk.MustNewDecFromStr("1.13050000"), - }, - provider.ProviderOsmosis: { - "ATOM": sdk.MustNewDecFromStr("28.40000000"), - "UMEE": sdk.MustNewDecFromStr("1.14000000"), - "LUNA": sdk.MustNewDecFromStr("64.10000000"), - }, - }, - expected: map[string]deviation{ - "ATOM": { - mean: sdk.MustNewDecFromStr("28.28"), - deviation: sdk.MustNewDecFromStr("0.085244745683629475"), - }, - "UMEE": { - mean: sdk.MustNewDecFromStr("1.1335"), - deviation: sdk.MustNewDecFromStr("0.004600724580614015"), - }, - }, - }, - - "non empty prices": { - prices: map[provider.Name]map[string]sdk.Dec{ - provider.ProviderBinance: { - "ATOM": sdk.MustNewDecFromStr("28.21000000"), - "UMEE": sdk.MustNewDecFromStr("1.13000000"), - "LUNA": sdk.MustNewDecFromStr("64.87000000"), - }, - provider.ProviderKraken: { - "ATOM": sdk.MustNewDecFromStr("28.23000000"), - "UMEE": sdk.MustNewDecFromStr("1.13050000"), - "LUNA": sdk.MustNewDecFromStr("64.85000000"), - }, - provider.ProviderOsmosis: { - "ATOM": sdk.MustNewDecFromStr("28.40000000"), - "UMEE": sdk.MustNewDecFromStr("1.14000000"), - "LUNA": sdk.MustNewDecFromStr("64.10000000"), - }, - }, - expected: map[string]deviation{ - "ATOM": { - mean: sdk.MustNewDecFromStr("28.28"), - deviation: sdk.MustNewDecFromStr("0.085244745683629475"), - }, - "UMEE": { - mean: sdk.MustNewDecFromStr("1.1335"), - deviation: sdk.MustNewDecFromStr("0.004600724580614015"), - }, - "LUNA": { - mean: sdk.MustNewDecFromStr("64.606666666666666666"), - deviation: sdk.MustNewDecFromStr("0.358360464089193609"), - }, - }, - }, - } - - for name, tc := range testCases { - tc := tc - - t.Run(name, func(t *testing.T) { - deviation, mean, err := oracle.StandardDeviation(tc.prices) - require.NoError(t, err) - require.Len(t, deviation, len(tc.expected)) - require.Len(t, mean, len(tc.expected)) - - for k, v := range tc.expected { - require.Equalf(t, v.deviation, deviation[k], "unexpected deviation for %s", k) - require.Equalf(t, v.mean, mean[k], "unexpected mean for %s", k) - } - }) - } -} diff --git a/price-feeder/pkg/httputil/http.go b/price-feeder/pkg/httputil/http.go deleted file mode 100644 index 271817d64..000000000 --- a/price-feeder/pkg/httputil/http.go +++ /dev/null @@ -1,32 +0,0 @@ -package httputil - -import ( - "encoding/json" - "net/http" -) - -// Common HTTP methods and header values -const ( - MethodGET = "GET" -) - -// ErrResponse defines an HTTP error response. -type ErrResponse struct { - Error string `json:"error"` -} - -// RespondWithError provides an auxiliary function to handle all failed HTTP -// requests. -func RespondWithError(w http.ResponseWriter, code int, err error) { - RespondWithJSON(w, code, ErrResponse{err.Error()}) -} - -// RespondWithJSON provides an auxiliary function to return an HTTP response -// with JSON content and an HTTP status code. -func RespondWithJSON(w http.ResponseWriter, code int, payload interface{}) { - response, _ := json.Marshal(payload) - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(code) - _, _ = w.Write(response) -} diff --git a/price-feeder/pkg/sync/sync.go b/price-feeder/pkg/sync/sync.go deleted file mode 100644 index 8871b3936..000000000 --- a/price-feeder/pkg/sync/sync.go +++ /dev/null @@ -1,33 +0,0 @@ -package sync - -import ( - "sync" -) - -// Closer implements a primitive to close a channel that signals process -// termination while allowing a caller to call Close multiple times safely. It -// should be used in cases where guarantees cannot be made about when and how -// many times closure is executed. -type Closer struct { - closeOnce sync.Once - doneCh chan struct{} -} - -// NewCloser returns a reference to a new Closer. -func NewCloser() *Closer { - return &Closer{doneCh: make(chan struct{})} -} - -// Done returns the internal done channel allowing the caller either block or wait -// for the Closer to be terminated/closed. -func (c *Closer) Done() <-chan struct{} { - return c.doneCh -} - -// Close gracefully closes the Closer. A caller should only call Close once, but -// it is safe to call it successive times. -func (c *Closer) Close() { - c.closeOnce.Do(func() { - close(c.doneCh) - }) -} diff --git a/price-feeder/price-feeder.Dockerfile b/price-feeder/price-feeder.Dockerfile deleted file mode 100644 index a1d2811b6..000000000 --- a/price-feeder/price-feeder.Dockerfile +++ /dev/null @@ -1,21 +0,0 @@ -# Fetch base packages -FROM golang:1.19-alpine AS builder -RUN apk add --no-cache make git libc-dev gcc linux-headers build-base -WORKDIR /src/ -COPY . . -# Cosmwasm - Download correct libwasmvm version -RUN WASMVM_VERSION=$(go list -m github.com/CosmWasm/wasmvm | cut -d ' ' -f 2) && \ - wget https://github.com/CosmWasm/wasmvm/releases/download/$WASMVM_VERSION/libwasmvm_muslc.$(uname -m).a \ - -O /lib/libwasmvm_muslc.a && \ - # verify checksum - wget https://github.com/CosmWasm/wasmvm/releases/download/$WASMVM_VERSION/checksums.txt -O /tmp/checksums.txt && \ - sha256sum /lib/libwasmvm_muslc.a | grep $(cat /tmp/checksums.txt | grep $(uname -m) | cut -d ' ' -f 1) -# Build the binary -RUN cd price-feeder && LEDGER_ENABLED=false BUILD_TAGS=muslc LINK_STATICALLY=true make install - -FROM alpine:3.17 -RUN apk add bash curl jq -COPY --from=builder /go/bin/price-feeder /usr/local/bin/ -EXPOSE 7171 -ENTRYPOINT [ "price-feeder" ] -STOPSIGNAL SIGTERM \ No newline at end of file diff --git a/price-feeder/price-feeder.md b/price-feeder/price-feeder.md deleted file mode 100644 index 8d5dff280..000000000 --- a/price-feeder/price-feeder.md +++ /dev/null @@ -1,98 +0,0 @@ -# Price feeder documentation - -## Description - -A side-car process that Juno validators must run in order to provide Juno's on-chain price oracle with price information. - -The ```price-feeder``` tool are based on Terra's [x/oracle](https://github.com/terra-money/classic-core/tree/main/x/oracle) module and [oracle-feeder](https://github.com/terra-money/oracle-feeder). - -## Overview - -Juno ```price-feeder``` includes 2 components: - -- PriceFeeder: responsible for obtaining price information from various reliable data sources, e.g. exchanges, and exposing this data via an API. -- PriceOracle: consumes this data and periodically submits vote and prevote messages following the oracle voting procedure. - -When ``PriceOracle`` start, it loops a process called ``Tick`` with 1000 milisecond interval. - -## ```Tick``` process in detail - -1. GetParamCache: Get the latest parameters in x/oracle -2. SetPrices: Retrieve all the prices and candles from our set of providers as determined in the config. Calculate TVWAP or VWAP prices, warns missing prices, and filters out any faulty providers. -3. Vote/Prevote exchangeRate. - -## ```SetPrices``` in detail - -1. Get all price providers -2. Collect prices from providers and set prices to local var. -3. Compute the prices and save it to ``oracle.prices``. - - Convert any non-USD denominated candles into USD - - Filter out any erroneous candles - - - ComputeTvwapsByProvider and ComputeTVWAP. - - Check if tvwapPrices available, else use recent prices & VWAP instead. - - ConvertTickersToUSD and FilterTickerDeviations. - - ComputeVWAP. - -### TVWAP calculate process - -TVWAP is time volume weighted average price. - -**Input**: Map(provider => Map(base => CandlePrice)) - -**Output**: Map(base => price) - -**Process**: - -For each candle within 5 timePeriod (5 mins), we calculate: - - volume = candle.Volume * (weightUnit * (period - timeDiff) + minimumTimeWeight) - - volumeSum[base] = volumeSum[base] + volume - - weightedPrices[base] = weightedPrices[base] + candle.Price * volume - -where: - -- weightUnit = (1 - minimumTimeWeight) / period -- timeDiff = now - candle.TimeStamp -- minimumTimeWeight = 0.2 - -Then use VWAP formula for `volumeSum` and `weightedPrices` - -**VWAP formula**: -VWAP is volume weighted average price. - - vwap[base] = weightedPrices[base] / volumeSum[base] - -### Explain TVWAP - -TWAP is the average price of a financial asset over a certain period of time. The time period is chosen by the trader based on the market analysis and trading strategy adopted. TWAPs are normally used to execute large-volume trades in smaller chunks without disturbing the market. Large-scale institutional traders track TWAP values and trade by dividing their orders into smaller parts to try and keep their orders as close to TWAP values as possible. - -TWAP benefits: - -- Lower likelihood of causing asset price volatility when placing large orders -- Ability to hide your market strategy from other large-volume traders -- Good strategy for those who prefer trading by placing frequent daily orders -- Applicability to algorithmic trading strategies - -TWAP limitations: - -- The TWAP formula concentrates on asset prices only and fails to take into account trading volumes. -- Limited applicability to the needs of smaller-scale traders - -VWAP is a mechanism used to calculate the price of an asset by taking price data from multiple trading environments and weighting each price by the amount of volume on each liquid market an asset is trading on. The VWAP calculation methodology is also used more broadly across finance as a technical indicator for traders, an order option offered by brokers or exchanges, and a benchmark. - -VWAP benefits: - -- Market Coverage. -- Highly Accurate and Fresh Data -- Manipulation-Resistant - -VWAP limitations: - -- inaccurate or misleading for large orders that require many days to fill. -- can be used to manipulate trading by placing trades only when market prices are at levels favorable with VWAP -- not account for opportunity cost. - -TVWAP formula is a new mechanism used to weight volume based on timestamp within the 5 min period. It's a variant of VWAP formula. The main difference between TVWAP and VWAP is that TVWAP shrinks the volume based on candle's timestamp, the further the timestamp count, the more volume will be shrink. VWAP is a measurement that shows the average price of an asset in a period of time, while TVWAP is a measurement that shows the average price of an asset in a period of time with a favor based on timestamp of data. diff --git a/price-feeder/router/middleware/middleware.go b/price-feeder/router/middleware/middleware.go deleted file mode 100644 index 04319ecda..000000000 --- a/price-feeder/router/middleware/middleware.go +++ /dev/null @@ -1,72 +0,0 @@ -package middleware - -import ( - "net/http" - "time" - - "github.com/justinas/alice" - "github.com/rs/cors" - "github.com/rs/zerolog" - "github.com/rs/zerolog/hlog" - - "github.com/CosmosContracts/juno/price-feeder/config" -) - -func Build(logger zerolog.Logger, cfg config.Config) alice.Chain { - mChain := alice.New() - mChain = AddRequestLoggingMiddleware(mChain, logger) - mChain = AddCORSMiddleware(mChain, logger, cfg) - - return mChain -} - -// AddRequestLoggingMiddleware appends HTTP logging middleware to a provided -// middleware chain. -func AddRequestLoggingMiddleware(mChain alice.Chain, logger zerolog.Logger) alice.Chain { - mChain = mChain.Append(hlog.NewHandler(logger)) - mChain = mChain.Append(hlog.AccessHandler(func(r *http.Request, status, size int, duration time.Duration) { - hlog.FromRequest(r).Info(). - Str("method", r.Method). - Str("url", r.URL.String()). - Int("status", status). - Int("size", size). - Dur("duration", duration). - Msg("") - })) - mChain = mChain.Append(hlog.RequestHandler("req")) - mChain = mChain.Append(hlog.RemoteAddrHandler("ip")) - mChain = mChain.Append(hlog.UserAgentHandler("ua")) - mChain = mChain.Append(hlog.RefererHandler("ref")) - mChain = mChain.Append(hlog.RequestIDHandler("req_id", "Request-Id")) - - return mChain -} - -// AddCORSMiddleware appends CORS middleware to a provided middleware chain. -func AddCORSMiddleware(mChain alice.Chain, logger zerolog.Logger, cfg config.Config) alice.Chain { - opts := cors.Options{ - AllowedMethods: []string{ - http.MethodGet, - http.MethodOptions, - }, - AllowCredentials: true, - AllowedHeaders: []string{ - "Content-Type", - "Access-Control-Allow-Headers", - "Authorization", - "X-Requested-With", - }, - AllowedOrigins: cfg.Server.AllowedOrigins, - } - - if cfg.Server.VerboseCORS { - opts.Debug = true - } - - c := cors.New(opts) - c.Log = &logger - - mChain = mChain.Append(c.Handler) - - return mChain -} diff --git a/price-feeder/router/v1/metrics.go b/price-feeder/router/v1/metrics.go deleted file mode 100644 index fce432f85..000000000 --- a/price-feeder/router/v1/metrics.go +++ /dev/null @@ -1,7 +0,0 @@ -package v1 - -import "github.com/cosmos/cosmos-sdk/telemetry" - -type Metrics interface { - Gather(format string) (telemetry.GatherResponse, error) -} diff --git a/price-feeder/router/v1/oracle.go b/price-feeder/router/v1/oracle.go deleted file mode 100644 index fbde757fb..000000000 --- a/price-feeder/router/v1/oracle.go +++ /dev/null @@ -1,16 +0,0 @@ -package v1 - -import ( - "time" - - "github.com/CosmosContracts/juno/price-feeder/oracle" - sdk "github.com/cosmos/cosmos-sdk/types" -) - -// Oracle defines the Oracle interface contract that the v1 router depends on. -type Oracle interface { - GetLastPriceSyncTimestamp() time.Time - GetPrices() map[string]sdk.Dec - GetTvwapPrices() oracle.PricesByProvider - GetVwapPrices() oracle.PricesByProvider -} diff --git a/price-feeder/router/v1/response.go b/price-feeder/router/v1/response.go deleted file mode 100644 index ad1ab9f3d..000000000 --- a/price-feeder/router/v1/response.go +++ /dev/null @@ -1,58 +0,0 @@ -package v1 - -import ( - "encoding/json" - "fmt" - "net/http" - - "github.com/CosmosContracts/juno/price-feeder/oracle/provider" - sdk "github.com/cosmos/cosmos-sdk/types" -) - -// Response constants -const ( - StatusAvailable = "available" -) - -type ( - // HealthZResponse defines the response type for the healthy API handler. - HealthZResponse struct { - Status string `json:"status" yaml:"status"` - Oracle struct { - LastSync string `json:"last_sync"` - } `json:"oracle"` - } - - // PricesResponse defines the response type for getting the latest exchange - // rates from the oracle. - PricesResponse struct { - Prices map[string]sdk.Dec `json:"prices"` - } - - PricesPerProviderResponse struct { - Prices map[provider.Name]map[string]sdk.Dec `json:"providers"` - } -) - -// errorResponse defines the attributes of a JSON error response. -type errorResponse struct { - Code int `json:"code,omitempty"` - Error string `json:"error"` -} - -// newErrorResponse creates a new errorResponse instance. -func newErrorResponse(code int, err string) errorResponse { - return errorResponse{Code: code, Error: err} -} - -// writeErrorResponse prepares and writes a HTTP error -// given a status code and an error message. -func writeErrorResponse(w http.ResponseWriter, status int, err string) { - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(status) - if bz, err := json.Marshal(newErrorResponse(0, err)); err == nil { - _, _ = w.Write(bz) - } else { - _, _ = w.Write([]byte(fmt.Sprintf("failed to marshal error response: %s", err))) - } -} diff --git a/price-feeder/router/v1/router.go b/price-feeder/router/v1/router.go deleted file mode 100644 index c1249a6cc..000000000 --- a/price-feeder/router/v1/router.go +++ /dev/null @@ -1,151 +0,0 @@ -package v1 - -import ( - "fmt" - "net/http" - "strings" - "text/template" - "time" - - "github.com/gorilla/mux" - "github.com/rs/zerolog" - - "github.com/CosmosContracts/juno/price-feeder/config" - "github.com/CosmosContracts/juno/price-feeder/pkg/httputil" - "github.com/CosmosContracts/juno/price-feeder/router/middleware" -) - -const ( - APIPathPrefix = "/api/v1" -) - -// Router defines a router wrapper used for registering v1 API routes. -type Router struct { - logger zerolog.Logger - cfg config.Config - oracle Oracle - metrics Metrics -} - -func New(logger zerolog.Logger, cfg config.Config, oracle Oracle, metrics Metrics) *Router { - return &Router{ - logger: logger.With().Str("module", "router").Logger(), - cfg: cfg, - oracle: oracle, - metrics: metrics, - } -} - -// RegisterRoutes register v1 API routes on the provided sub-router. -func (r *Router) RegisterRoutes(rtr *mux.Router, prefix string) { - v1Router := rtr.PathPrefix(prefix).Subrouter() - - // build middleware chain - mChain := middleware.Build(r.logger, r.cfg) - - // handle all preflight request - v1Router.Methods("OPTIONS").HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - for _, origin := range r.cfg.Server.AllowedOrigins { - if origin == req.Header.Get("Origin") { - w.Header().Set("Access-Control-Allow-Origin", origin) - } - } - - w.Header().Set("Access-Control-Allow-Methods", "GET, OPTIONS") - w.Header().Set( - "Access-Control-Allow-Headers", - "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With", - ) - w.Header().Set("Access-Control-Allow-Credentials", "true") - w.WriteHeader(http.StatusOK) - }) - - v1Router.Handle( - "/healthz", - mChain.ThenFunc(r.healthzHandler()), - ).Methods(httputil.MethodGET) - - v1Router.Handle( - "/prices", - mChain.ThenFunc(r.pricesHandler()), - ).Methods(httputil.MethodGET) - - v1Router.Handle( - "/prices/providers/tvwap", - mChain.ThenFunc(r.candlePricesHandler()), - ).Methods(httputil.MethodGET) - - v1Router.Handle( - "/prices/providers/vwap", - mChain.ThenFunc(r.tickerPricesHandler()), - ).Methods(httputil.MethodGET) - - if r.cfg.Telemetry.Enabled { - v1Router.Handle( - "/metrics", - mChain.ThenFunc(r.metricsHandler()), - ).Methods(httputil.MethodGET) - } -} - -func (r *Router) healthzHandler() http.HandlerFunc { - return func(w http.ResponseWriter, req *http.Request) { - resp := HealthZResponse{ - Status: StatusAvailable, - } - - resp.Oracle.LastSync = r.oracle.GetLastPriceSyncTimestamp().Format(time.RFC3339) - - httputil.RespondWithJSON(w, http.StatusOK, resp) - } -} - -func (r *Router) pricesHandler() http.HandlerFunc { - return func(w http.ResponseWriter, req *http.Request) { - resp := PricesResponse{ - Prices: r.oracle.GetPrices(), - } - - httputil.RespondWithJSON(w, http.StatusOK, resp) - } -} - -func (r *Router) candlePricesHandler() http.HandlerFunc { - return func(w http.ResponseWriter, req *http.Request) { - resp := PricesPerProviderResponse{ - Prices: r.oracle.GetTvwapPrices(), - } - - httputil.RespondWithJSON(w, http.StatusOK, resp) - } -} - -func (r *Router) tickerPricesHandler() http.HandlerFunc { - return func(w http.ResponseWriter, req *http.Request) { - resp := PricesPerProviderResponse{ - Prices: r.oracle.GetVwapPrices(), - } - - httputil.RespondWithJSON(w, http.StatusOK, resp) - } -} - -func (r *Router) metricsHandler() http.HandlerFunc { - return func(w http.ResponseWriter, req *http.Request) { - format := strings.TrimSpace(req.FormValue("format")) - - gr, err := r.metrics.Gather(format) - if err != nil { - writeErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("failed to gather metrics: %s", err)) - return - } - - w.Header().Set("Content-Type", gr.ContentType) - if t, err := template.New("metrics").Parse(string(gr.Metrics)); err == nil { - // unchecked err, too late for bad response - _ = t.ExecuteTemplate(w, "metrics", nil) - } else { - writeErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("failed to parse metrics: %s", err)) - } - } -} diff --git a/price-feeder/router/v1/router_test.go b/price-feeder/router/v1/router_test.go deleted file mode 100644 index fc1b90cc0..000000000 --- a/price-feeder/router/v1/router_test.go +++ /dev/null @@ -1,153 +0,0 @@ -package v1_test - -import ( - "encoding/json" - "net/http" - "net/http/httptest" - "testing" - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/gorilla/mux" - "github.com/rs/zerolog" - "github.com/stretchr/testify/suite" - - "github.com/CosmosContracts/juno/price-feeder/config" - "github.com/CosmosContracts/juno/price-feeder/oracle" - "github.com/CosmosContracts/juno/price-feeder/oracle/provider" - v1 "github.com/CosmosContracts/juno/price-feeder/router/v1" - "github.com/cosmos/cosmos-sdk/telemetry" -) - -var ( - _ v1.Oracle = (*mockOracle)(nil) - - mockPrices = map[string]sdk.Dec{ - "ATOM": sdk.MustNewDecFromStr("34.84"), - "UMEE": sdk.MustNewDecFromStr("4.21"), - } - - mockComputedPrices = map[provider.Name]map[string]sdk.Dec{ - provider.ProviderBinance: { - "ATOM": sdk.MustNewDecFromStr("28.21000000"), - "UMEE": sdk.MustNewDecFromStr("1.13000000"), - }, - provider.ProviderKraken: { - "ATOM": sdk.MustNewDecFromStr("28.268700"), - "UMEE": sdk.MustNewDecFromStr("1.13000000"), - }, - } -) - -type mockOracle struct{} - -func (m mockOracle) GetLastPriceSyncTimestamp() time.Time { - return time.Now() -} - -func (m mockOracle) GetPrices() map[string]sdk.Dec { - return mockPrices -} - -func (m mockOracle) GetTvwapPrices() oracle.PricesByProvider { - return mockComputedPrices -} - -func (m mockOracle) GetVwapPrices() oracle.PricesByProvider { - return mockComputedPrices -} - -type mockMetrics struct{} - -func (mockMetrics) Gather(format string) (telemetry.GatherResponse, error) { - return telemetry.GatherResponse{}, nil -} - -type RouterTestSuite struct { - suite.Suite - - mux *mux.Router - router *v1.Router -} - -// SetupSuite executes once before the suite's tests are executed. -func (rts *RouterTestSuite) SetupSuite() { - mux := mux.NewRouter() - cfg := config.Config{ - Server: config.Server{ - AllowedOrigins: []string{}, - VerboseCORS: false, - }, - } - - r := v1.New(zerolog.Nop(), cfg, mockOracle{}, mockMetrics{}) - r.RegisterRoutes(mux, v1.APIPathPrefix) - - rts.mux = mux - rts.router = r -} - -func TestServiceTestSuite(t *testing.T) { - suite.Run(t, new(RouterTestSuite)) -} - -func (rts *RouterTestSuite) executeRequest(req *http.Request) *httptest.ResponseRecorder { - rr := httptest.NewRecorder() - rts.mux.ServeHTTP(rr, req) - - return rr -} - -func (rts *RouterTestSuite) TestHealthz() { - req, err := http.NewRequest("GET", "/api/v1/healthz", nil) - rts.Require().NoError(err) - - response := rts.executeRequest(req) - rts.Require().Equal(http.StatusOK, response.Code) - - var respBody map[string]interface{} - rts.Require().NoError(json.Unmarshal(response.Body.Bytes(), &respBody)) - rts.Require().Equal(respBody["status"], v1.StatusAvailable) -} - -func (rts *RouterTestSuite) TestPrices() { - req, err := http.NewRequest("GET", "/api/v1/prices", nil) - rts.Require().NoError(err) - - response := rts.executeRequest(req) - rts.Require().Equal(http.StatusOK, response.Code) - - var respBody v1.PricesResponse - rts.Require().NoError(json.Unmarshal(response.Body.Bytes(), &respBody)) - rts.Require().Equal(respBody.Prices["ATOM"], mockPrices["ATOM"]) - rts.Require().Equal(respBody.Prices["UMEE"], mockPrices["UMEE"]) - rts.Require().Equal(respBody.Prices["FOO"], sdk.Dec{}) -} - -func (rts *RouterTestSuite) TestTvwap() { - req, err := http.NewRequest("GET", "/api/v1/prices/providers/tvwap", nil) - rts.Require().NoError(err) - response := rts.executeRequest(req) - rts.Require().Equal(http.StatusOK, response.Code) - - var respBody v1.PricesPerProviderResponse - rts.Require().NoError(json.Unmarshal(response.Body.Bytes(), &respBody)) - rts.Require().Equal( - respBody.Prices[provider.ProviderBinance]["ATOM"], - mockComputedPrices[provider.ProviderBinance]["ATOM"], - ) -} - -func (rts *RouterTestSuite) TestVwap() { - req, err := http.NewRequest("GET", "/api/v1/prices/providers/vwap", nil) - rts.Require().NoError(err) - response := rts.executeRequest(req) - rts.Require().Equal(http.StatusOK, response.Code) - - var respBody v1.PricesPerProviderResponse - rts.Require().NoError(json.Unmarshal(response.Body.Bytes(), &respBody)) - rts.Require().Equal( - respBody.Prices[provider.ProviderBinance]["ATOM"], - mockComputedPrices[provider.ProviderBinance]["ATOM"], - ) -} diff --git a/price-feeder/tools/tools.go b/price-feeder/tools/tools.go deleted file mode 100644 index 939aaabba..000000000 --- a/price-feeder/tools/tools.go +++ /dev/null @@ -1,12 +0,0 @@ -//go:build tools -// +build tools - -// This file uses the recommended method for tracking developer tools in a Go -// module. -// -// REF: https://github.com/golang/go/wiki/Modules#how-can-i-track-tool-dependencies-for-a-module -package tools - -import ( - _ "github.com/golangci/golangci-lint/cmd/golangci-lint" -) diff --git a/x/oracle/abci.go b/x/oracle/abci.go deleted file mode 100644 index 70333fa48..000000000 --- a/x/oracle/abci.go +++ /dev/null @@ -1,148 +0,0 @@ -package oracle - -import ( - "time" - - "github.com/cosmos/cosmos-sdk/telemetry" - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/CosmosContracts/juno/v13/x/oracle/keeper" - "github.com/CosmosContracts/juno/v13/x/oracle/types" -) - -// isPeriodLastBlock returns true if we are at the last block of the period -func isPeriodLastBlock(ctx sdk.Context, blocksPerPeriod uint64) bool { - return (uint64(ctx.BlockHeight())+1)%blocksPerPeriod == 0 -} - -// EndBlocker is called at the end of every block -func EndBlocker(ctx sdk.Context, k keeper.Keeper) error { - defer telemetry.ModuleMeasureSince(types.ModuleName, time.Now(), telemetry.MetricKeyEndBlocker) - - params := k.GetParams(ctx) - - if isPeriodLastBlock(ctx, params.VotePeriod) { - // remove out of date history price - for _, denom := range params.TwapTrackingList { - removeTime := ctx.BlockTime().Add(-params.TwapDuration) - k.RemoveHistoryEntryBeforeTime(ctx, denom.BaseDenom, removeTime) - } - - // Build claim map over all validators in active set - validatorClaimMap := make(map[string]types.Claim) - powerReduction := k.StakingKeeper.PowerReduction(ctx) - - for _, v := range k.StakingKeeper.GetBondedValidatorsByPower(ctx) { - addr := v.GetOperator() - validatorClaimMap[addr.String()] = types.NewClaim(v.GetConsensusPower(powerReduction), 0, 0, addr) - } - - var ( - // voteTargets defines the symbol (ticker) denoms that we require votes on - voteTargets []string - voteTargetDenoms []string - ) - for _, v := range params.Whitelist { - voteTargets = append(voteTargets, v.SymbolDenom) - voteTargetDenoms = append(voteTargetDenoms, v.BaseDenom) - } - - k.ClearExchangeRates(ctx) - - // NOTE: it filters out inactive or jailed validators - ballotDenomSlice := k.OrganizeBallotByDenom(ctx, validatorClaimMap) - - // Iterate through ballots and update exchange rates; drop if not enough votes have been achieved. - for _, ballotDenom := range ballotDenomSlice { - // Get weighted median of exchange rates - exchangeRate, err := Tally(ballotDenom.Ballot, params.RewardBand, validatorClaimMap) - if err != nil { - return err - } - - // Set the exchange rate, emit ABCI event - if err = k.SetExchangeRateWithEvent(ctx, ballotDenom.Denom, exchangeRate); err != nil { - return err - } - - votingPeriodCount := (uint64(ctx.BlockHeight()) + 1) / params.VotePeriod - // set the price history - if _, found := k.IsInTrackingList(ctx, ballotDenom.Denom); found { - k.SetPriceHistoryEntry(ctx, ballotDenom.Denom, ctx.BlockTime(), exchangeRate, votingPeriodCount) - } - } - - // update miss counting & slashing - voteTargetsLen := len(voteTargets) - claimSlice := types.ClaimMapToSlice(validatorClaimMap) - for _, claim := range claimSlice { - // Skip valid voters - if int(claim.WinCount) == voteTargetsLen { - continue - } - - // Increase miss counter - k.SetMissCounter(ctx, claim.Recipient, k.GetMissCounter(ctx, claim.Recipient)+1) - } - - // Distribute rewards to ballot winners - k.RewardBallotWinners( - ctx, - int64(params.VotePeriod), - int64(params.RewardDistributionWindow), - voteTargetDenoms, - claimSlice, - ) - - // Clear the ballot - k.ClearBallots(ctx, params.VotePeriod) - } - - // Slash oracle providers who missed voting over the threshold and - // reset miss counters of all validators at the last block of slash window - if isPeriodLastBlock(ctx, params.SlashWindow) { - k.SlashAndResetMissCounters(ctx) - } - - return nil -} - -// Tally calculates and returns the median. It sets the set of voters to be -// rewarded, i.e. voted within a reasonable spread from the weighted median to -// the store. Note, the ballot is sorted by ExchangeRate. -func Tally( - ballot types.ExchangeRateBallot, - rewardBand sdk.Dec, - validatorClaimMap map[string]types.Claim, -) (sdk.Dec, error) { - weightedMedian, err := ballot.WeightedMedian() - if err != nil { - return sdk.ZeroDec(), err - } - standardDeviation, err := ballot.StandardDeviation() - if err != nil { - return sdk.ZeroDec(), err - } - - // rewardSpread is the MAX((weightedMedian * (rewardBand/2)), standardDeviation) - rewardSpread := weightedMedian.Mul(rewardBand.QuoInt64(2)) - rewardSpread = sdk.MaxDec(rewardSpread, standardDeviation) - - for _, tallyVote := range ballot { - // Filter ballot winners. For voters, we filter out the tally vote iff: - // (weightedMedian - rewardSpread) <= ExchangeRate <= (weightedMedian + rewardSpread) - if (tallyVote.ExchangeRate.GTE(weightedMedian.Sub(rewardSpread)) && - tallyVote.ExchangeRate.LTE(weightedMedian.Add(rewardSpread))) || - !tallyVote.ExchangeRate.IsPositive() { - - key := tallyVote.Voter.String() - claim := validatorClaimMap[key] - - claim.Weight += tallyVote.Power - claim.WinCount++ - validatorClaimMap[key] = claim - } - } - - return weightedMedian, nil -} diff --git a/x/oracle/abci_test.go b/x/oracle/abci_test.go deleted file mode 100644 index 10a45605d..000000000 --- a/x/oracle/abci_test.go +++ /dev/null @@ -1,166 +0,0 @@ -package oracle_test - -import ( - "fmt" - "testing" - "time" - - "github.com/cosmos/cosmos-sdk/simapp" - sdk "github.com/cosmos/cosmos-sdk/types" - minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" - "github.com/cosmos/cosmos-sdk/x/staking" - "github.com/cosmos/cosmos-sdk/x/staking/teststaking" - "github.com/stretchr/testify/suite" - "github.com/tendermint/tendermint/crypto/secp256k1" - tmrand "github.com/tendermint/tendermint/libs/rand" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - - app "github.com/CosmosContracts/juno/v13/app" - appparams "github.com/CosmosContracts/juno/v13/app/params" - "github.com/CosmosContracts/juno/v13/x/oracle" - "github.com/CosmosContracts/juno/v13/x/oracle/types" -) - -const ( - displayDenom string = appparams.DisplayDenom - bondDenom string = appparams.BondDenom -) - -type IntegrationTestSuite struct { - suite.Suite - - ctx sdk.Context - app *app.App -} - -const ( - initialPower = int64(10000000000) -) - -func (s *IntegrationTestSuite) SetupTest() { - require := s.Require() - isCheckTx := false - app := app.Setup(s.T(), isCheckTx, 1) - ctx := app.BaseApp.NewContext(isCheckTx, tmproto.Header{ - ChainID: fmt.Sprintf("test-chain-%s", tmrand.Str(4)), - }) - - oracle.InitGenesis(ctx, app.OracleKeeper, *types.DefaultGenesisState()) - - sh := teststaking.NewHelper(s.T(), ctx, app.StakingKeeper) - sh.Denom = bondDenom - amt := sdk.TokensFromConsensusPower(100, sdk.DefaultPowerReduction) - - // mint and send coins to validator - require.NoError(app.BankKeeper.MintCoins(ctx, minttypes.ModuleName, initCoins)) - require.NoError(app.BankKeeper.SendCoinsFromModuleToAccount(ctx, minttypes.ModuleName, addr, initCoins)) - - sh.CreateValidator(valAddr, valPubKey, amt, true) - - staking.EndBlocker(ctx, app.StakingKeeper) - - s.app = app - s.ctx = ctx -} - -// Test addresses -var ( - valPubKeys = simapp.CreateTestPubKeys(1) - - valPubKey = valPubKeys[0] - pubKey = secp256k1.GenPrivKey().PubKey() - addr = sdk.AccAddress(pubKey.Address()) - valAddr = sdk.ValAddress(pubKey.Address()) - - initTokens = sdk.TokensFromConsensusPower(initialPower, sdk.DefaultPowerReduction) - initCoins = sdk.NewCoins(sdk.NewCoin(bondDenom, initTokens)) -) - -var OracleHistoryTestCases = []struct { - exchangeRates []string - expectedHistoricTWAPMax sdk.Dec - expectedHistoricTWAPMin sdk.Dec -}{ - { - []string{ - "1.0", "1.2", "1.1", "1.4", "1.1", "1.15", - "1.2", "1.3", "1.2", "1.12", "1.2", "1.15", - }, - sdk.MustNewDecFromStr("1.18"), // upper bound for TWAP[0, 11] - sdk.MustNewDecFromStr("1.16"), // lower bound for TWAP[0, 11] - }, - { - []string{ - "2.3", "2.12", "2.14", "2.24", "2.18", "2.15", - "2.51", "2.59", "2.67", "2.76", "2.89", "2.85", - }, - sdk.MustNewDecFromStr("2.5"), // upper bound for TWAP[0, 11] - sdk.MustNewDecFromStr("2.3"), // lower bound for TWAP[0, 11] - }, -} - -func (s *IntegrationTestSuite) TestOracleHistoryEndBlocker() { - app, ctx := s.app, s.ctx - - for _, tc := range OracleHistoryTestCases { - startTimeStamp := time.Now().UTC() // store timestamp before insertions - - ctx = ctx.WithBlockHeight(ctx.BlockHeight() + int64(app.OracleKeeper.GetParams(ctx).VotePeriod-1)) - ctx = ctx.WithBlockTime(time.Now().UTC()) - - // check if last price is updated after each vote period - for _, exchangeRate := range tc.exchangeRates { - var tuples types.ExchangeRateTuples - for _, denom := range app.OracleKeeper.Whitelist(ctx) { - tuples = append(tuples, types.ExchangeRateTuple{ - Denom: denom.SymbolDenom, - ExchangeRate: sdk.MustNewDecFromStr(exchangeRate), - }) - } - - prevote := types.AggregateExchangeRatePrevote{ - Hash: "hash", - Voter: valAddr.String(), - SubmitBlock: uint64(ctx.BlockHeight()), - } - app.OracleKeeper.SetAggregateExchangeRatePrevote(ctx, valAddr, prevote) - err := oracle.EndBlocker(ctx, app.OracleKeeper) - s.Require().NoError(err) - - ctx = ctx.WithBlockHeight(ctx.BlockHeight() + int64(app.OracleKeeper.VotePeriod(ctx))) - ctx = ctx.WithBlockTime(time.Now().UTC()) - - vote := types.AggregateExchangeRateVote{ - ExchangeRateTuples: tuples, - Voter: valAddr.String(), - } - app.OracleKeeper.SetAggregateExchangeRateVote(ctx, valAddr, vote) - - err = oracle.EndBlocker(ctx, app.OracleKeeper) - s.Require().NoError(err) - - // historical prices query - for _, denom := range app.OracleKeeper.Whitelist(ctx) { - readExchangeRate, err := app.OracleKeeper.GetExchangeRate(ctx, denom.SymbolDenom) - s.Require().NoError(err) - s.Require().Equal(sdk.MustNewDecFromStr(exchangeRate), readExchangeRate) - } - } - - // historical TWAP - for _, denom := range app.OracleKeeper.Whitelist(ctx) { - // query for TWAP of all entered exchangeRates - twap, err := app.OracleKeeper.GetArithmetricTWAP(ctx, denom.SymbolDenom, startTimeStamp, time.Now().UTC()) - s.Require().NoError(err) - s.Require().True(tc.expectedHistoricTWAPMax.GTE(twap)) - s.Require().True(tc.expectedHistoricTWAPMin.LTE(twap)) - } - - ctx = ctx.WithBlockHeight(0) - ctx = ctx.WithBlockTime(time.Now().UTC()) - } -} - -func TestOracleTestSuite(t *testing.T) { - suite.Run(t, new(IntegrationTestSuite)) -} diff --git a/x/oracle/client/cli/gov_tx.go b/x/oracle/client/cli/gov_tx.go deleted file mode 100644 index 4c1d4eda0..000000000 --- a/x/oracle/client/cli/gov_tx.go +++ /dev/null @@ -1,194 +0,0 @@ -package cli - -import ( - "os" - - "github.com/CosmosContracts/juno/v13/x/oracle/types" - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/tx" - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/gov/client/cli" - - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - "github.com/spf13/cobra" -) - -func ProposalAddTrackingPriceHistoryCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "add-tracking-price-history [json-proposal]", - Short: "Add tracking price history list", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, _, _, deposit, err := getProposalInfo(cmd) - if err != nil { - return err - } - - proposal, err := ParseAddTrackingPriceHistoryProposal(clientCtx.Codec, args[0]) - if err != nil { - return err - } - if err = proposal.ValidateBasic(); err != nil { - return err - } - - msg, err := govtypes.NewMsgSubmitProposal(&proposal, deposit, clientCtx.GetFromAddress()) - if err != nil { - return err - } - if err = msg.ValidateBasic(); err != nil { - return err - } - - return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) - }, - } - - return cmd -} - -func ProposalAddTrackingPriceHistoryWithWhitelistCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "add-tracking-price-history-with-accept-list [json-proposal]", - Short: "Add tracking price history list with accept list", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, _, _, deposit, err := getProposalInfo(cmd) - if err != nil { - return err - } - - proposal, err := AddTrackingPriceHistoryWithWhitelistProposal(clientCtx.Codec, args[0]) - if err != nil { - return err - } - if err = proposal.ValidateBasic(); err != nil { - return err - } - - msg, err := govtypes.NewMsgSubmitProposal(&proposal, deposit, clientCtx.GetFromAddress()) - if err != nil { - return err - } - if err = msg.ValidateBasic(); err != nil { - return err - } - - return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) - }, - } - - return cmd -} - -func ProposalRemoveTrackingPriceHistoryCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "remove-tracking-price-history [json-proposal]", - Short: "Remove tracking price history from tracking list", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, _, _, deposit, err := getProposalInfo(cmd) - if err != nil { - return err - } - - proposal, err := ParseRemoveTrackingPriceHistoryProposal(clientCtx.Codec, args[0]) - if err != nil { - return err - } - if err = proposal.ValidateBasic(); err != nil { - return err - } - - msg, err := govtypes.NewMsgSubmitProposal(&proposal, deposit, clientCtx.GetFromAddress()) - if err != nil { - return err - } - if err = msg.ValidateBasic(); err != nil { - return err - } - - return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) - }, - } - - return cmd -} - -func getProposalInfo(cmd *cobra.Command) (client.Context, string, string, sdk.Coins, error) { //nolint:unparam - clientCtx, err := client.GetClientTxContext(cmd) - if err != nil { - return client.Context{}, "", "", nil, err - } - - proposalTitle, err := cmd.Flags().GetString(cli.FlagTitle) //nolint:staticcheck - if err != nil { - return clientCtx, proposalTitle, "", nil, err - } - - proposalDescr, err := cmd.Flags().GetString(cli.FlagDescription) //nolint:staticcheck - if err != nil { - return client.Context{}, proposalTitle, proposalDescr, nil, err - } - - depositArg, err := cmd.Flags().GetString(cli.FlagDeposit) - if err != nil { - return client.Context{}, proposalTitle, proposalDescr, nil, err - } - - deposit, err := sdk.ParseCoinsNormalized(depositArg) - if err != nil { - return client.Context{}, proposalTitle, proposalDescr, deposit, err - } - - return clientCtx, proposalTitle, proposalDescr, deposit, nil -} - -func ParseAddTrackingPriceHistoryProposal(cdc codec.JSONCodec, proposalFile string) (types.AddTrackingPriceHistoryProposal, error) { - var proposal types.AddTrackingPriceHistoryProposal - - contents, err := os.ReadFile(proposalFile) - if err != nil { - return proposal, err - } - - err = cdc.UnmarshalJSON(contents, &proposal) - if err != nil { - return proposal, err - } - - return proposal, nil -} - -func AddTrackingPriceHistoryWithWhitelistProposal(cdc codec.JSONCodec, proposalFile string) (types.AddTrackingPriceHistoryWithWhitelistProposal, error) { - var proposal types.AddTrackingPriceHistoryWithWhitelistProposal - - contents, err := os.ReadFile(proposalFile) - if err != nil { - return proposal, err - } - - err = cdc.UnmarshalJSON(contents, &proposal) - if err != nil { - return proposal, err - } - - return proposal, nil -} - -func ParseRemoveTrackingPriceHistoryProposal(cdc codec.JSONCodec, proposalFile string) (types.RemoveTrackingPriceHistoryProposal, error) { - var proposal types.RemoveTrackingPriceHistoryProposal - - contents, err := os.ReadFile(proposalFile) - if err != nil { - return proposal, err - } - - err = cdc.UnmarshalJSON(contents, &proposal) - if err != nil { - return proposal, err - } - - return proposal, nil -} diff --git a/x/oracle/client/cli/query.go b/x/oracle/client/cli/query.go deleted file mode 100644 index 28a25001a..000000000 --- a/x/oracle/client/cli/query.go +++ /dev/null @@ -1,406 +0,0 @@ -package cli - -import ( - "fmt" - "strings" - "time" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/spf13/cobra" - - "github.com/CosmosContracts/juno/v13/x/oracle/types" - "github.com/CosmosContracts/juno/v13/x/oracle/util" -) - -// GetQueryCmd returns the CLI query commands for the x/oracle module. -func GetQueryCmd(queryRoute string) *cobra.Command { - cmd := &cobra.Command{ - Use: types.ModuleName, - Short: fmt.Sprintf("Querying commands for the %s module", types.ModuleName), - DisableFlagParsing: true, - SuggestionsMinimumDistance: 2, - RunE: client.ValidateCmd, - } - - cmd.AddCommand( - GetCmdQueryAggregatePrevote(), - GetCmdQueryAggregateVote(), - GetCmdQueryParams(), - GetCmdQueryExchangeRates(), - GetCmdQueryExchangeRate(), - GetCmdQueryFeederDelegation(), - GetCmdQueryMissCounter(), - GetCmdQuerySlashWindow(), - GetCmdQueryAllPriceHistory(), - GetCmdQueryPriceHistoryAt(), - GetCmdQueryTwapTrackingLists(), - GetCmdQueryTwapPrice(), - ) - - return cmd -} - -// GetCmdQueryParams implements the query params command. -func GetCmdQueryParams() *cobra.Command { - cmd := &cobra.Command{ - Use: "params", - Args: cobra.NoArgs, - Short: "Query the current Oracle params", - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, err := client.GetClientQueryContext(cmd) - if err != nil { - return err - } - - queryClient := types.NewQueryClient(clientCtx) - - res, err := queryClient.Params(cmd.Context(), &types.QueryParams{}) - return util.PrintOrErr(res, err, clientCtx) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - return cmd -} - -// GetCmdQueryAggregateVote implements the query aggregate prevote of the -// validator command. -func GetCmdQueryAggregateVote() *cobra.Command { - cmd := &cobra.Command{ - Use: "aggregate-votes [validator]", - Args: cobra.RangeArgs(0, 1), - Short: "Query outstanding oracle aggregate votes", - Long: strings.TrimSpace(` -Query outstanding oracle aggregate vote. - -$ junod query oracle aggregate-votes - -Or, you can filter with voter address - -$ junod query oracle aggregate-votes junovaloper... -`), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, err := client.GetClientQueryContext(cmd) - if err != nil { - return err - } - - queryClient := types.NewQueryClient(clientCtx) - query := types.QueryAggregateVote{} - - if len(args) > 0 { - validator, err := sdk.ValAddressFromBech32(args[0]) - if err != nil { - return err - } - query.ValidatorAddr = validator.String() - } - - res, err := queryClient.AggregateVote(cmd.Context(), &query) - return util.PrintOrErr(res, err, clientCtx) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - return cmd -} - -// GetCmdQueryAggregatePrevote implements the query aggregate prevote of the -// validator command. -func GetCmdQueryAggregatePrevote() *cobra.Command { - cmd := &cobra.Command{ - Use: "aggregate-prevotes [validator]", - Args: cobra.RangeArgs(0, 1), - Short: "Query outstanding oracle aggregate prevotes", - Long: strings.TrimSpace(` -Query outstanding oracle aggregate prevotes. - -$ junod query oracle aggregate-prevotes - -Or, can filter with voter address - -$ junod query oracle aggregate-prevotes junovaloper... -`), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, err := client.GetClientQueryContext(cmd) - if err != nil { - return err - } - - queryClient := types.NewQueryClient(clientCtx) - query := types.QueryAggregatePrevote{} - - if len(args) > 0 { - validator, err := sdk.ValAddressFromBech32(args[0]) - if err != nil { - return err - } - query.ValidatorAddr = validator.String() - } - - res, err := queryClient.AggregatePrevote(cmd.Context(), &query) - return util.PrintOrErr(res, err, clientCtx) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - return cmd -} - -// GetCmdQueryExchangeRates implements the query rate command. -func GetCmdQueryExchangeRates() *cobra.Command { - cmd := &cobra.Command{ - Use: "exchange-rates", - Args: cobra.NoArgs, - Short: "Query the exchange rates", - Long: strings.TrimSpace(` -Query the current exchange rates of assets based on USD. -You can find the current list of active denoms by running - -$ junod query oracle exchange-rates -`), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, err := client.GetClientQueryContext(cmd) - if err != nil { - return err - } - queryClient := types.NewQueryClient(clientCtx) - - res, err := queryClient.ExchangeRates(cmd.Context(), &types.QueryExchangeRates{}) - return util.PrintOrErr(res, err, clientCtx) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - return cmd -} - -// GetCmdQueryExchangeRates implements the query rate command. -func GetCmdQueryExchangeRate() *cobra.Command { - cmd := &cobra.Command{ - Use: "exchange-rate [denom]", - Args: cobra.ExactArgs(1), - Short: "Query the exchange rates", - Long: strings.TrimSpace(` -Query the current exchange rates of an asset based on USD. - -$ junod query oracle exchange-rate ATOM -`), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, err := client.GetClientQueryContext(cmd) - if err != nil { - return err - } - queryClient := types.NewQueryClient(clientCtx) - res, err := queryClient.ExchangeRates( - cmd.Context(), - &types.QueryExchangeRates{ - Denom: args[0], - }, - ) - return util.PrintOrErr(res, err, clientCtx) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - return cmd -} - -// GetCmdQueryFeederDelegation implements the query feeder delegation command. -func GetCmdQueryFeederDelegation() *cobra.Command { - cmd := &cobra.Command{ - Use: "feeder-address [validator_operator]", - Args: cobra.ExactArgs(1), - Short: "Query the current delegated address for a given validator operator address", - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, err := client.GetClientQueryContext(cmd) - if err != nil { - return err - } - queryClient := types.NewQueryClient(clientCtx) - - if _, err = sdk.ValAddressFromBech32(args[0]); err != nil { - return err - } - res, err := queryClient.FeederDelegation(cmd.Context(), &types.QueryFeederDelegation{ - ValidatorAddr: args[0], - }) - return util.PrintOrErr(res, err, clientCtx) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - return cmd -} - -// GetCmdQueryMissCounter implements the miss counter query command. -func GetCmdQueryMissCounter() *cobra.Command { - cmd := &cobra.Command{ - Use: "miss-counter [validator]", - Args: cobra.ExactArgs(1), - Short: "Query the current miss counter for a given validator address", - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, err := client.GetClientQueryContext(cmd) - if err != nil { - return err - } - queryClient := types.NewQueryClient(clientCtx) - - if _, err = sdk.ValAddressFromBech32(args[0]); err != nil { - return err - } - res, err := queryClient.MissCounter(cmd.Context(), &types.QueryMissCounter{ - ValidatorAddr: args[0], - }) - return util.PrintOrErr(res, err, clientCtx) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - return cmd -} - -// GetCmdQuerySlashWindow implements the slash window query command. -func GetCmdQuerySlashWindow() *cobra.Command { - cmd := &cobra.Command{ - Use: "slash-window", - Short: "Query the current slash window progress", - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, err := client.GetClientQueryContext(cmd) - if err != nil { - return err - } - queryClient := types.NewQueryClient(clientCtx) - - res, err := queryClient.SlashWindow(cmd.Context(), &types.QuerySlashWindow{}) - return util.PrintOrErr(res, err, clientCtx) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - return cmd -} - -func GetCmdQueryTwapTrackingLists() *cobra.Command { - cmd := &cobra.Command{ - Use: "price-tracking-list", - Short: "Query current price tracking list", - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, err := client.GetClientQueryContext(cmd) - if err != nil { - return err - } - - queryClient := types.NewQueryClient(clientCtx) - - res, err := queryClient.TwapTrackingLists(cmd.Context(), &types.QueryTwapTrackingLists{}) - if err != nil { - return err - } - return util.PrintOrErr(res, err, clientCtx) - }, - } - flags.AddQueryFlagsToCmd(cmd) - return cmd -} - -func GetCmdQueryPriceHistoryAt() *cobra.Command { - cmd := &cobra.Command{ - Use: "price-history-at [denom] [time_stamp]", - Short: "Query price history at specific block height", - Args: cobra.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, err := client.GetClientQueryContext(cmd) - if err != nil { - return err - } - - time, err := time.Parse(time.RFC3339, args[1]) - if err != nil { - return err - } - - queryClient := types.NewQueryClient(clientCtx) - - req := &types.QueryPriceHistoryAtTime{ - Denom: strings.ToUpper(args[0]), - Time: time, - } - res, err := queryClient.PriceHistoryAtTime(cmd.Context(), req) - return util.PrintOrErr(res, err, clientCtx) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - return cmd -} - -func GetCmdQueryAllPriceHistory() *cobra.Command { - cmd := &cobra.Command{ - Use: "all-price-history [denom]", - Short: "Show all price history storage on chain", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx := client.GetClientContextFromCmd(cmd) - - pageReq, err := client.ReadPageRequest(cmd.Flags()) - if err != nil { - return err - } - - queryClient := types.NewQueryClient(clientCtx) - - req := &types.QueryAllPriceHistory{ - Denom: strings.ToUpper(args[0]), - Pagination: pageReq, - } - - res, err := queryClient.AllPriceHistory(cmd.Context(), req) - return util.PrintOrErr(res, err, clientCtx) - }, - } - - flags.AddPaginationFlagsToCmd(cmd, cmd.Use) - flags.AddQueryFlagsToCmd(cmd) - return cmd -} - -func GetCmdQueryTwapPrice() *cobra.Command { - cmd := &cobra.Command{ - Use: "twap [denom] [start_time] [end_time]", - Short: "Query twap between period time", - Long: strings.TrimSpace( - `Query twap for pool. Start and end time must be in RFC3339 format. -Example: -$ junod q oracle twap JUNO 2022-12-25T19:42:07.100Z 2022-12-25T20:42:07.100Z -`), - Args: cobra.ExactArgs(3), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx := client.GetClientContextFromCmd(cmd) - queryClient := types.NewQueryClient(clientCtx) - - startTime, err := time.Parse(time.RFC3339, args[1]) - if err != nil { - return err - } - endTime, err := time.Parse(time.RFC3339, args[2]) - if err != nil { - return err - } - - req := &types.QueryArithmeticTwapPriceBetweenTime{ - Denom: strings.ToUpper(args[0]), - StartTime: startTime, - EndTime: endTime, - } - - res, err := queryClient.ArithmeticTwapPriceBetweenTime(cmd.Context(), req) - return util.PrintOrErr(res, err, clientCtx) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - return cmd -} diff --git a/x/oracle/client/cli/tx.go b/x/oracle/client/cli/tx.go deleted file mode 100644 index 8cee411b1..000000000 --- a/x/oracle/client/cli/tx.go +++ /dev/null @@ -1,172 +0,0 @@ -package cli - -import ( - "fmt" - "strings" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/client/tx" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/spf13/cobra" - - "github.com/CosmosContracts/juno/v13/x/oracle/types" -) - -// GetTxCmd returns the CLI transaction commands for the x/oracle module. -func GetTxCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: types.ModuleName, - Short: fmt.Sprintf("Transaction commands for the %s module", types.ModuleName), - DisableFlagParsing: true, - SuggestionsMinimumDistance: 2, - RunE: client.ValidateCmd, - } - - cmd.AddCommand( - GetCmdDelegateFeedConsent(), - GetCmdAggregateExchangeRatePrevote(), - GetCmdAggregateExchangeRateVote(), - ) - - return cmd -} - -// GetCmdDelegateFeedConsent creates a Cobra command to generate or -// broadcast a transaction with a MsgDelegateFeedConsent message. -func GetCmdDelegateFeedConsent() *cobra.Command { - cmd := &cobra.Command{ - Use: "set-feeder [feeder] --from [validator_key]", - Args: cobra.ExactArgs(1), - Short: "Delegate the permission to vote for the oracle to an address", - Long: strings.TrimSpace(` -Delegate the permission to submit exchange rate votes for the oracle to an address. -Delegation can keep your validator operator key offline and use a separate replaceable key online. -$ junod tx oracle set-feeder juno1... --from validator_key -where "juno1..." is the address you want to delegate your voting rights to. -`), - RunE: func(cmd *cobra.Command, args []string) error { - if _, err := cmd.Flags().GetString(flags.FlagFrom); err != nil { - return err - } - - clientCtx, err := client.GetClientTxContext(cmd) - if err != nil { - return err - } - - feederAddr, err := sdk.AccAddressFromBech32(args[0]) - if err != nil { - return err - } - - msg := types.NewMsgDelegateFeedConsent(sdk.ValAddress(clientCtx.GetFromAddress()), feederAddr) - - if err := msg.ValidateBasic(); err != nil { - return err - } - - return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) - }, - } - - flags.AddTxFlagsToCmd(cmd) - - return cmd -} - -// GetCmdAggregateExchangeRatePrevote creates a Cobra command to generate or -// broadcast a transaction with a MsgAggregateExchangeRatePrevote message. -func GetCmdAggregateExchangeRatePrevote() *cobra.Command { - cmd := &cobra.Command{ - Use: "exchange-rate-prevote [hash] [validator-address]", - Args: cobra.MinimumNArgs(1), - Short: "Submit an exchange rate prevote with a hash", - Long: fmt.Sprintf(`Submit an exchange rate prevote with a hash as a hex string - representation of a byte array. - Ex: junod tx oracle exchange-rate-prevote %s --from alice`, - "19c30cf9ea8aa0e0b03904162cadec0f2024a76d"), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, err := client.GetClientTxContext(cmd) - if err != nil { - return err - } - - hash, err := types.AggregateVoteHashFromHexString(args[0]) - if err != nil { - return err - } - - valAddress := sdk.ValAddress(clientCtx.GetFromAddress()) - if len(args) > 1 { - valAddress, err = sdk.ValAddressFromBech32(args[1]) - if err != nil { - return err - } - } - - msg := types.NewMsgAggregateExchangeRatePrevote( - hash, - clientCtx.GetFromAddress(), - valAddress, - ) - - if err := msg.ValidateBasic(); err != nil { - return err - } - - return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) - }, - } - - flags.AddTxFlagsToCmd(cmd) - - return cmd -} - -// GetCmdAggregateExchangeRateVote creates a Cobra command to generate or -// broadcast a transaction with a NewMsgAggregateExchangeRateVote message. -func GetCmdAggregateExchangeRateVote() *cobra.Command { - cmd := &cobra.Command{ - Use: "exchange-rate-vote [salt] [exchange-rates] [validator-address]", - Args: cobra.MinimumNArgs(2), - Short: "Submit an exchange rate vote with the salt and exchange rate string", - Long: fmt.Sprintf(`Submit an exchange rate vote with the salt of the previous hash, and the - exchange rate string previously used in the hash. - Ex: junod tx oracle exchange-rate-vote %s %s --from alice`, - "0cf33fb528b388660c3a42c3f3250e983395290b75fef255050fb5bc48a6025f", - "foo:1.0,bar:1232.123", - ), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, err := client.GetClientTxContext(cmd) - if err != nil { - return err - } - - valAddress := sdk.ValAddress(clientCtx.GetFromAddress()) - if len(args) > 2 { - valAddress, err = sdk.ValAddressFromBech32(args[2]) - if err != nil { - return err - } - } - - msg := types.NewMsgAggregateExchangeRateVote( - args[0], - args[1], - clientCtx.GetFromAddress(), - valAddress, - ) - - if err := msg.ValidateBasic(); err != nil { - return err - } - - return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) - }, - } - - flags.AddTxFlagsToCmd(cmd) - - return cmd -} diff --git a/x/oracle/client/proposal_handler.go b/x/oracle/client/proposal_handler.go deleted file mode 100644 index 61ef49bcf..000000000 --- a/x/oracle/client/proposal_handler.go +++ /dev/null @@ -1,13 +0,0 @@ -package client - -import ( - "github.com/CosmosContracts/juno/v13/x/oracle/client/cli" - "github.com/CosmosContracts/juno/v13/x/oracle/client/rest" - govclient "github.com/cosmos/cosmos-sdk/x/gov/client" -) - -var ( - ProposalHandlerAddTrackingPriceHistory = govclient.NewProposalHandler(cli.ProposalAddTrackingPriceHistoryCmd, rest.EmptyRestHandler) - ProposalHandlerAddTrackingPriceHistoryWithWhitelist = govclient.NewProposalHandler(cli.ProposalAddTrackingPriceHistoryWithWhitelistCmd, rest.EmptyRestHandler) - ProposalRemoveTrackingPriceHistory = govclient.NewProposalHandler(cli.ProposalRemoveTrackingPriceHistoryCmd, rest.EmptyRestHandler) -) diff --git a/x/oracle/client/rest/gov.go b/x/oracle/client/rest/gov.go deleted file mode 100644 index ecb31ad74..000000000 --- a/x/oracle/client/rest/gov.go +++ /dev/null @@ -1,18 +0,0 @@ -package rest - -import ( - "net/http" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/types/rest" - govrest "github.com/cosmos/cosmos-sdk/x/gov/client/rest" -) - -func EmptyRestHandler(cliCtx client.Context) govrest.ProposalRESTHandler { - return govrest.ProposalRESTHandler{ - SubRoute: "unsupported", - Handler: func(w http.ResponseWriter, r *http.Request) { - rest.WriteErrorResponse(w, http.StatusBadRequest, "Legacy REST Routes are not supported for gov proposals") - }, - } -} diff --git a/x/oracle/docs/README.md b/x/oracle/docs/README.md deleted file mode 100644 index 42d152eac..000000000 --- a/x/oracle/docs/README.md +++ /dev/null @@ -1,202 +0,0 @@ -# Oracle Setup Documentation - -## Install Base Dependencies - -```sh -# Ubuntu -sudo apt update && sudo apt upgrade -y -sudo apt-get install make gcc jq git -``` - -### Install Go 1.19 - -```sh -curl -fsSL https://golang.org/dl/go1.19.3.linux-amd64.tar.gz | sudo tar -xzC /usr/local - -# `go version` should output "go version go1.19.3 linux/amd64" -``` - -### Prepare Go Paths - -```sh -# Only run this if your go path is not yet setup. -# Check this with `echo $PATH` - -echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> $HOME/.bashrc - -# Reload the bashrc file to the current terminal -source $HOME/.bashrc -``` - -### Build Price Feeder - -```sh -cd ~ -git clone https://github.com/CosmosContracts/juno.git -cd ./juno/price-feeder -make install - -# Copy config to your location for future use & editing -cp config.example.toml $HOME/.juno/oracle-config.toml - -# If you get `cp: cannot create regular file '$HOME/.juno/oracle-config.toml': No such file or directory`, -# run: `junod init [moniker]`. Then run the cp command again - -price-feeder version # sdk: v0.45.11 and go1.19.* -# If it is not found, your go path is not set -``` - ---- - -## Systemd - -```sh -sudo apt update && sudo apt upgrade -y -sudo apt install git -y -``` - -## Edit Variables - -```sh -nano $HOME/juno/scripts/oracle/systemd.sh -``` - -```sh -#!/bin/sh - -VALOPER_ADDR="junovaloper1..." -FEEDER_ADDR="juno1..." -CHAIN_ID="juno-1" -# anything if you use the test keyring in your oracle-config.toml -KEYRING_PASS="mykeyringpass" - -sudo apt update && sudo apt upgrade -y -sudo apt-get install make gcc jq - -# Install GO -GO_VER="1.19.2" -cd $HOME -wget "https://golang.org/dl/go$GO_VER.linux-amd64.tar.gz" -sudo rm -rf /usr/local/go -sudo tar -C /usr/local -xzf "go$GO_VER.linux-amd64.tar.gz" -rm "go$GO_VER.linux-amd64.tar.gz" -echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> $HOME/.profile -source $HOME/.profile - -# Install price feeder -cd pricefeeder -make install - -# Setup price feeder config -cp $HOME/juno/price-feeder/config.example.toml $HOME/.juno/oracle-config.toml - -sed -i \ -'s/0.0001stake/0.025ujuno/g; - s/address = "juno1w20tfhnehc33rgtm9tg8gdtea0svn7twfnyqee"/address = "'"$FEEDER_ADDR"'"/g; - s/validator = "junovaloper1w20tfhnehc33rgtm9tg8gdtea0svn7twkwj0zq"/validator = "'"$VALOPER_ADDR"'"/g; - s/chain_id = "test-1"/chain_id = "'"$CHAIN_ID"'"/g; - s/"chain_id", "test-1"/"chain_id", "'"$CHAIN_ID"'"/g' \ -$HOME/.juno/oracle-config.toml - - -# Setup systemd service -echo "[Unit] -Description=juno-price-feeder -After=network.target - -[Service] -Type=simple -User=$USER -ExecStart=$HOME/go/bin/price-feeder $HOME/.juno/oracle-config.toml --log-level debug -Restart=on-abort -LimitNOFILE=65535 -Environment=\"PRICE_FEEDER_PASS=$KEYRING_PASS\" - -[Install] -WantedBy=multi-user.target" | sudo tee /etc/systemd/system/oracle.service - -sudo systemctl daemon-reload -sudo systemctl enable oracle -sudo systemctl start oracle -``` - -### Run System Script - -```sh -sh $HOME/juno/scripts/oracle/systemd.sh -``` - -### Check the values are correct - -```sh -cat /etc/systemd/system/oracle.service -``` - -### Check Status - -```sh -sudo journalctl -fu oracle --output cat -``` - -### Stop the Systemd service - -```sh -sudo systemctl stop oracle -``` - ---- - -## Docker - -```sh -sudo apt update -y && apt upgrade -y && apt autoremove -y -sudo apt install containerd docker.io docker-compose -y - -sudo systemctl start docker -``` - -### Clone Respository - -```sh -git clone https://github.com/CosmosContracts/juno -cd $HOME/juno -``` - -### Build Image - -```sh -docker build -f ./price-feeder/price-feeder.Dockerfile -t price-feeder . -``` - -### Run Container - -```sh -# This requires use of the test keyring as we mount to the keyring-test volume. -# We also mount as read only to the oracle config from above to /oracle-config.toml in the container -# network host allows us to query the host machine RPC (https://localhost:26657) -docker run -d --name price-feeder \ - -e PRICE_FEEDER_PASS="mypass" \ - -v /root/.juno/keyring-test:/root/.juno/keyring-test:ro \ - --mount type=bind,source=/root/.juno/oracle-config.toml,target=/oracle-config.toml,readonly \ - --network="host" \ - price-feeder /oracle-config.toml -``` - -### Check Logs - -```sh -docker logs price-feeder -``` - -### Shell Into Container - -```sh -docker exec -it price-feeder /bin/sh -``` - -### Stop or Remove Container - -```sh -docker stop price-feeder -docker rm price-feeder -``` diff --git a/x/oracle/genesis.go b/x/oracle/genesis.go deleted file mode 100644 index 683a37995..000000000 --- a/x/oracle/genesis.go +++ /dev/null @@ -1,19 +0,0 @@ -package oracle - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/CosmosContracts/juno/v13/x/oracle/keeper" - "github.com/CosmosContracts/juno/v13/x/oracle/types" -) - -// InitGenesis initializes the x/oracle module's state from a provided genesis -// state. -func InitGenesis(ctx sdk.Context, keeper keeper.Keeper, genState types.GenesisState) { - keeper.InitGenesis(ctx, genState) -} - -// ExportGenesis returns the x/oracle module's exported genesis. -func ExportGenesis(ctx sdk.Context, keeper keeper.Keeper) *types.GenesisState { - return keeper.ExportGenesis(ctx) -} diff --git a/x/oracle/keeper/alias_functions.go b/x/oracle/keeper/alias_functions.go deleted file mode 100644 index 053578b22..000000000 --- a/x/oracle/keeper/alias_functions.go +++ /dev/null @@ -1,19 +0,0 @@ -package keeper - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - - "github.com/CosmosContracts/juno/v13/x/oracle/types" -) - -// GetOracleAccount returns oracle ModuleAccount. -func (k Keeper) GetOracleAccount(ctx sdk.Context) authtypes.ModuleAccountI { - return k.accountKeeper.GetModuleAccount(ctx, types.ModuleName) -} - -// GetRewardPool retrieves the balance of the oracle module account. -func (k Keeper) GetRewardPool(ctx sdk.Context, denom string) sdk.Coin { - acc := k.accountKeeper.GetModuleAccount(ctx, types.ModuleName) - return k.bankKeeper.GetBalance(ctx, acc.GetAddress(), denom) -} diff --git a/x/oracle/keeper/ballot.go b/x/oracle/keeper/ballot.go deleted file mode 100644 index 2dfba71a8..000000000 --- a/x/oracle/keeper/ballot.go +++ /dev/null @@ -1,71 +0,0 @@ -package keeper - -import ( - "sort" - - "github.com/CosmosContracts/juno/v13/x/oracle/types" - - sdk "github.com/cosmos/cosmos-sdk/types" -) - -// OrganizeBallotByDenom collects all oracle votes for the current vote period, -// categorized by the votes' denom parameter. -func (k Keeper) OrganizeBallotByDenom( - ctx sdk.Context, - validatorClaimMap map[string]types.Claim, -) []types.BallotDenom { - votes := map[string]types.ExchangeRateBallot{} - - // collect aggregate votes - aggregateHandler := func(voterAddr sdk.ValAddress, vote types.AggregateExchangeRateVote) bool { - // organize ballot only for the active validators - claim, ok := validatorClaimMap[vote.Voter] - if ok { - power := claim.Power - - for _, tuple := range vote.ExchangeRateTuples { - tmpPower := power - - votes[tuple.Denom] = append( - votes[tuple.Denom], - types.NewVoteForTally(tuple.ExchangeRate, tuple.Denom, voterAddr, tmpPower), - ) - } - } - - return false - } - - k.IterateAggregateExchangeRateVotes(ctx, aggregateHandler) - - // sort created ballots - for denom, ballot := range votes { - sort.Sort(ballot) - votes[denom] = ballot - } - return types.BallotMapToSlice(votes) -} - -// ClearBallots clears all tallied prevotes and votes from the store. -func (k Keeper) ClearBallots(ctx sdk.Context, votePeriod uint64) { - // clear all aggregate prevotes - k.IterateAggregateExchangeRatePrevotes( - ctx, - func(voterAddr sdk.ValAddress, aggPrevote types.AggregateExchangeRatePrevote) bool { - if ctx.BlockHeight() > int64(aggPrevote.SubmitBlock+votePeriod) { - k.DeleteAggregateExchangeRatePrevote(ctx, voterAddr) - } - - return false - }, - ) - - // clear all aggregate votes - k.IterateAggregateExchangeRateVotes( - ctx, - func(voterAddr sdk.ValAddress, _ types.AggregateExchangeRateVote) bool { - k.DeleteAggregateExchangeRateVote(ctx, voterAddr) - return false - }, - ) -} diff --git a/x/oracle/keeper/ballot_test.go b/x/oracle/keeper/ballot_test.go deleted file mode 100644 index b6f4bb493..000000000 --- a/x/oracle/keeper/ballot_test.go +++ /dev/null @@ -1,75 +0,0 @@ -package keeper_test - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/CosmosContracts/juno/v13/x/oracle/types" -) - -func (s *IntegrationTestSuite) TestBallot_OrganizeBallotByDenom() { - require := s.Require() - s.app.OracleKeeper.SetExchangeRate(s.ctx, displayDenom, sdk.OneDec()) - claimMap := make(map[string]types.Claim) - - // Empty Map - res := s.app.OracleKeeper.OrganizeBallotByDenom(s.ctx, claimMap) - require.Empty(res) - - s.app.OracleKeeper.SetAggregateExchangeRateVote( - s.ctx, valAddr, types.AggregateExchangeRateVote{ - ExchangeRateTuples: types.ExchangeRateTuples{ - types.ExchangeRateTuple{ - Denom: "ujuno", - ExchangeRate: sdk.OneDec(), - }, - }, - Voter: valAddr.String(), - }, - ) - - claimMap[valAddr.String()] = types.Claim{ - Power: 1, - Weight: 1, - WinCount: 1, - Recipient: valAddr, - } - res = s.app.OracleKeeper.OrganizeBallotByDenom(s.ctx, claimMap) - require.Equal([]types.BallotDenom{ - { - Ballot: types.ExchangeRateBallot{types.NewVoteForTally(sdk.OneDec(), "ujuno", valAddr, 1)}, - Denom: "ujuno", - }, - }, res) -} - -func (s *IntegrationTestSuite) TestBallot_ClearBallots() { - prevote := types.AggregateExchangeRatePrevote{ - Hash: "hash", - Voter: addr.String(), - SubmitBlock: 0, - } - s.app.OracleKeeper.SetAggregateExchangeRatePrevote(s.ctx, valAddr, prevote) - prevoteRes, err := s.app.OracleKeeper.GetAggregateExchangeRatePrevote(s.ctx, valAddr) - s.Require().NoError(err) - s.Require().Equal(prevoteRes, prevote) - - var tuples types.ExchangeRateTuples - tuples = append(tuples, types.ExchangeRateTuple{ - Denom: "ujuno", - ExchangeRate: sdk.ZeroDec(), - }) - vote := types.AggregateExchangeRateVote{ - ExchangeRateTuples: tuples, - Voter: addr.String(), - } - s.app.OracleKeeper.SetAggregateExchangeRateVote(s.ctx, valAddr, vote) - voteRes, err := s.app.OracleKeeper.GetAggregateExchangeRateVote(s.ctx, valAddr) - s.Require().NoError(err) - s.Require().Equal(voteRes, vote) - - s.app.OracleKeeper.ClearBallots(s.ctx, 0) - _, err = s.app.OracleKeeper.GetAggregateExchangeRatePrevote(s.ctx, valAddr) - s.Require().Error(err) - _, err = s.app.OracleKeeper.GetAggregateExchangeRateVote(s.ctx, valAddr) - s.Require().Error(err) -} diff --git a/x/oracle/keeper/genesis.go b/x/oracle/keeper/genesis.go deleted file mode 100644 index a1cfc6faa..000000000 --- a/x/oracle/keeper/genesis.go +++ /dev/null @@ -1,151 +0,0 @@ -package keeper - -import ( - "fmt" - - "github.com/CosmosContracts/juno/v13/x/oracle/types" - sdk "github.com/cosmos/cosmos-sdk/types" -) - -// InitGenesis initializes the x/oracle module's state from a provided genesis -// state. -func (k Keeper) InitGenesis(ctx sdk.Context, genState types.GenesisState) { - for _, d := range genState.FeederDelegations { - voter, err := sdk.ValAddressFromBech32(d.ValidatorAddress) - if err != nil { - panic(err) - } - - feeder, err := sdk.AccAddressFromBech32(d.FeederAddress) - if err != nil { - panic(err) - } - - k.SetFeederDelegation(ctx, voter, feeder) - } - - for _, ex := range genState.ExchangeRates { - k.SetExchangeRate(ctx, ex.Denom, ex.ExchangeRate) - } - - for _, mc := range genState.MissCounters { - operator, err := sdk.ValAddressFromBech32(mc.ValidatorAddress) - if err != nil { - panic(err) - } - - k.SetMissCounter(ctx, operator, mc.MissCounter) - } - - for _, ap := range genState.AggregateExchangeRatePrevotes { - valAddr, err := sdk.ValAddressFromBech32(ap.Voter) - if err != nil { - panic(err) - } - - k.SetAggregateExchangeRatePrevote(ctx, valAddr, ap) - } - - for _, av := range genState.AggregateExchangeRateVotes { - valAddr, err := sdk.ValAddressFromBech32(av.Voter) - if err != nil { - panic(err) - } - - k.SetAggregateExchangeRateVote(ctx, valAddr, av) - } - - for _, historyPrice := range genState.PriceHistory { - err := k.appendPriceHistory(ctx, historyPrice.Denom.SymbolDenom, historyPrice.PriceHistoryEntry...) - if err != nil { - panic(err) - } - } - - k.SetParams(ctx, genState.Params) - - // check if the module account exists - moduleAcc := k.GetOracleAccount(ctx) - if moduleAcc == nil { - panic(fmt.Sprintf("%s module account has not been set", types.ModuleName)) - } -} - -// ExportGenesis returns the x/oracle module's exported genesis. -func (k Keeper) ExportGenesis(ctx sdk.Context) *types.GenesisState { - params := k.GetParams(ctx) - - feederDelegations := []types.FeederDelegation{} - k.IterateFeederDelegations(ctx, func(valAddr sdk.ValAddress, feederAddr sdk.AccAddress) (stop bool) { - feederDelegations = append(feederDelegations, types.FeederDelegation{ - ValidatorAddress: valAddr.String(), - FeederAddress: feederAddr.String(), - }) - - return false - }) - - exchangeRates := []types.ExchangeRateTuple{} - k.IterateExchangeRates(ctx, func(denom string, rate sdk.Dec) (stop bool) { - exchangeRates = append(exchangeRates, types.ExchangeRateTuple{ - Denom: denom, - ExchangeRate: rate, - }) - - return false - }) - - missCounters := []types.MissCounter{} - k.IterateMissCounters(ctx, func(operator sdk.ValAddress, missCounter uint64) (stop bool) { - missCounters = append(missCounters, types.MissCounter{ - ValidatorAddress: operator.String(), - MissCounter: missCounter, - }) - - return false - }) - - aggregateExchangeRatePrevotes := []types.AggregateExchangeRatePrevote{} - k.IterateAggregateExchangeRatePrevotes( - ctx, - func(_ sdk.ValAddress, aggregatePrevote types.AggregateExchangeRatePrevote) (stop bool) { - aggregateExchangeRatePrevotes = append(aggregateExchangeRatePrevotes, aggregatePrevote) - return false - }, - ) - - aggregateExchangeRateVotes := []types.AggregateExchangeRateVote{} - k.IterateAggregateExchangeRateVotes( - ctx, - func(_ sdk.ValAddress, aggregateVote types.AggregateExchangeRateVote) bool { - aggregateExchangeRateVotes = append(aggregateExchangeRateVotes, aggregateVote) - return false - }, - ) - - priceHistory := []types.PriceHistory{} - for _, denom := range params.TwapTrackingList { - // Get price history entry list - var priceHistoryEntryLists []types.PriceHistoryEntry - k.IterateDenomPriceHistory(ctx, denom.SymbolDenom, func(votingPeriodCount uint64, priceHistoryEntry types.PriceHistoryEntry) bool { - priceHistoryEntryLists = append(priceHistoryEntryLists, priceHistoryEntry) - return false - }) - // Add to priceHistory - denomPriceHistory := types.PriceHistory{ - Denom: denom, - PriceHistoryEntry: priceHistoryEntryLists, - } - priceHistory = append(priceHistory, denomPriceHistory) - } - - return types.NewGenesisState( - params, - exchangeRates, - feederDelegations, - missCounters, - aggregateExchangeRatePrevotes, - aggregateExchangeRateVotes, - priceHistory, - ) -} diff --git a/x/oracle/keeper/grpc_query.go b/x/oracle/keeper/grpc_query.go deleted file mode 100644 index 721228424..000000000 --- a/x/oracle/keeper/grpc_query.go +++ /dev/null @@ -1,372 +0,0 @@ -package keeper - -import ( - "context" - - "github.com/cosmos/cosmos-sdk/store/prefix" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/query" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" - - "github.com/CosmosContracts/juno/v13/x/oracle/types" -) - -var _ types.QueryServer = querier{} - -// Querier implements a QueryServer for the x/oracle module. -type querier struct { - Keeper -} - -// NewQuerier returns an implementation of the oracle QueryServer interface -// for the provided Keeper. -func NewQuerier(keeper Keeper) types.QueryServer { - return &querier{Keeper: keeper} -} - -// Params queries params of x/oracle module. -func (q querier) Params( - goCtx context.Context, - req *types.QueryParams, -) (*types.QueryParamsResponse, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "empty request") - } - - ctx := sdk.UnwrapSDKContext(goCtx) - params := q.GetParams(ctx) - - return &types.QueryParamsResponse{Params: params}, nil -} - -// ExchangeRates queries exchange rates of all denoms, or, if specified, returns -// a single denom. -func (q querier) ExchangeRates( - goCtx context.Context, - req *types.QueryExchangeRates, -) (*types.QueryExchangeRatesResponse, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "empty request") - } - - ctx := sdk.UnwrapSDKContext(goCtx) - - var exchangeRates sdk.DecCoins - - if len(req.Denom) > 0 { - exchangeRate, err := q.GetExchangeRate(ctx, req.Denom) - if err != nil { - return nil, err - } - - exchangeRates = exchangeRates.Add(sdk.NewDecCoinFromDec(req.Denom, exchangeRate)) - } else { - q.IterateExchangeRates(ctx, func(denom string, rate sdk.Dec) (stop bool) { - exchangeRates = exchangeRates.Add(sdk.NewDecCoinFromDec(denom, rate)) - return false - }) - } - - return &types.QueryExchangeRatesResponse{ExchangeRates: exchangeRates}, nil -} - -// ActiveExchangeRates queries all denoms for which exchange rates exist. -func (q querier) ActiveExchangeRates( - goCtx context.Context, - req *types.QueryActiveExchangeRates, -) (*types.QueryActiveExchangeRatesResponse, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "empty request") - } - - ctx := sdk.UnwrapSDKContext(goCtx) - - denoms := []string{} - q.IterateExchangeRates(ctx, func(denom string, _ sdk.Dec) (stop bool) { - denoms = append(denoms, denom) - return false - }) - - return &types.QueryActiveExchangeRatesResponse{ActiveRates: denoms}, nil -} - -// FeederDelegation queries the account address to which the validator operator -// delegated oracle vote rights. -func (q querier) FeederDelegation( - goCtx context.Context, - req *types.QueryFeederDelegation, -) (*types.QueryFeederDelegationResponse, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "empty request") - } - - valAddr, err := sdk.ValAddressFromBech32(req.ValidatorAddr) - if err != nil { - return nil, status.Error(codes.InvalidArgument, err.Error()) - } - - ctx := sdk.UnwrapSDKContext(goCtx) - feederAddr, err := q.GetFeederDelegation(ctx, valAddr) - if err != nil { - return nil, err - } - - return &types.QueryFeederDelegationResponse{ - FeederAddr: feederAddr.String(), - }, nil -} - -// MissCounter queries oracle miss counter of a validator. -func (q querier) MissCounter( - goCtx context.Context, - req *types.QueryMissCounter, -) (*types.QueryMissCounterResponse, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "empty request") - } - - valAddr, err := sdk.ValAddressFromBech32(req.ValidatorAddr) - if err != nil { - return nil, status.Error(codes.InvalidArgument, err.Error()) - } - - ctx := sdk.UnwrapSDKContext(goCtx) - - return &types.QueryMissCounterResponse{ - MissCounter: q.GetMissCounter(ctx, valAddr), - }, nil -} - -// SlashWindow queries the current slash window progress of the oracle. -func (q querier) SlashWindow( - goCtx context.Context, - req *types.QuerySlashWindow, -) (*types.QuerySlashWindowResponse, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "empty request") - } - - ctx := sdk.UnwrapSDKContext(goCtx) - params := q.GetParams(ctx) - - return &types.QuerySlashWindowResponse{ - WindowProgress: (uint64(ctx.BlockHeight()) % params.SlashWindow) / - params.VotePeriod, - }, nil -} - -// AggregatePrevote queries an aggregate prevote of a validator. -func (q querier) AggregatePrevote( - goCtx context.Context, - req *types.QueryAggregatePrevote, -) (*types.QueryAggregatePrevoteResponse, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "empty request") - } - - valAddr, err := sdk.ValAddressFromBech32(req.ValidatorAddr) - if err != nil { - return nil, status.Error(codes.InvalidArgument, err.Error()) - } - - ctx := sdk.UnwrapSDKContext(goCtx) - - prevote, err := q.GetAggregateExchangeRatePrevote(ctx, valAddr) - if err != nil { - return nil, err - } - - return &types.QueryAggregatePrevoteResponse{ - AggregatePrevote: prevote, - }, nil -} - -// AggregatePrevotes queries aggregate prevotes of all validators -func (q querier) AggregatePrevotes( - goCtx context.Context, - req *types.QueryAggregatePrevotes, -) (*types.QueryAggregatePrevotesResponse, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "empty request") - } - - ctx := sdk.UnwrapSDKContext(goCtx) - - var prevotes []types.AggregateExchangeRatePrevote - q.IterateAggregateExchangeRatePrevotes(ctx, func(_ sdk.ValAddress, prevote types.AggregateExchangeRatePrevote) bool { - prevotes = append(prevotes, prevote) - return false - }) - - return &types.QueryAggregatePrevotesResponse{ - AggregatePrevotes: prevotes, - }, nil -} - -// AggregateVote queries an aggregate vote of a validator -func (q querier) AggregateVote( - goCtx context.Context, - req *types.QueryAggregateVote, -) (*types.QueryAggregateVoteResponse, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "empty request") - } - - valAddr, err := sdk.ValAddressFromBech32(req.ValidatorAddr) - if err != nil { - return nil, status.Error(codes.InvalidArgument, err.Error()) - } - - ctx := sdk.UnwrapSDKContext(goCtx) - - vote, err := q.GetAggregateExchangeRateVote(ctx, valAddr) - if err != nil { - return nil, err - } - - return &types.QueryAggregateVoteResponse{ - AggregateVote: vote, - }, nil -} - -// AggregateVotes queries aggregate votes of all validators -func (q querier) AggregateVotes( - goCtx context.Context, - req *types.QueryAggregateVotes, -) (*types.QueryAggregateVotesResponse, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "empty request") - } - - ctx := sdk.UnwrapSDKContext(goCtx) - - var votes []types.AggregateExchangeRateVote - q.IterateAggregateExchangeRateVotes(ctx, func(_ sdk.ValAddress, vote types.AggregateExchangeRateVote) bool { - votes = append(votes, vote) - return false - }) - - return &types.QueryAggregateVotesResponse{ - AggregateVotes: votes, - }, nil -} - -// TwapTrackingLists queries all price tracking lists -func (q querier) TwapTrackingLists( - goCtx context.Context, - req *types.QueryTwapTrackingLists, -) (*types.QueryTwapTrackingListsResponse, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "empty request") - } - - ctx := sdk.UnwrapSDKContext(goCtx) - params := q.GetParams(ctx) - - var result []string - for _, trackingDenom := range params.TwapTrackingList { - result = append(result, trackingDenom.SymbolDenom) - } - - return &types.QueryTwapTrackingListsResponse{ - TwapTrackingLists: result, - }, nil -} - -// PriceHistoryAtTime queries price history of req denom at specific time -func (q querier) PriceHistoryAtTime( - goCtx context.Context, - req *types.QueryPriceHistoryAtTime, -) (*types.QueryPriceHistoryAtTimeResponse, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "empty request") - } - - ctx := sdk.UnwrapSDKContext(goCtx) - denom, found := q.IsInTrackingList(ctx, req.Denom) - if !found { - return nil, status.Errorf(codes.InvalidArgument, "Denom %s not in tracking list", req.Denom) - } - - priceHistoryEntry, err := q.getHistoryEntryAtOrBeforeTime(ctx, req.Denom, req.Time) - if err != nil { - return nil, err - } - - return &types.QueryPriceHistoryAtTimeResponse{ - Denom: denom, - PriceHistoryEntry: priceHistoryEntry, - }, nil -} - -// AllPriceHistory queries all price history of denom in tracking time duration -func (q querier) AllPriceHistory( - goCtx context.Context, - req *types.QueryAllPriceHistory, -) (*types.QueryAllPriceHistoryResponse, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "empty request") - } - - ctx := sdk.UnwrapSDKContext(goCtx) - denom, found := q.IsInTrackingList(ctx, req.Denom) - if !found { - return nil, status.Errorf(codes.InvalidArgument, "Denom %s not in tracking list", req.Denom) - } - - store := ctx.KVStore(q.storeKey) - priceHistoryStore := prefix.NewStore(store, types.FormatHistoricalDenomIndexPrefix(req.Denom)) - - var priceHistoryEntrys []types.PriceHistoryEntry - - pageRes, err := query.Paginate(priceHistoryStore, req.Pagination, func(key []byte, value []byte) error { - var priceHistoryEntry types.PriceHistoryEntry - if err := q.cdc.Unmarshal(value, &priceHistoryEntry); err != nil { - return err - } - priceHistoryEntrys = append(priceHistoryEntrys, priceHistoryEntry) - return nil - }) - if err != nil { - return nil, status.Error(codes.Internal, err.Error()) - } - - return &types.QueryAllPriceHistoryResponse{ - Denom: denom, - PriceHistoryEntrys: priceHistoryEntrys, - Pagination: pageRes, - }, nil -} - -// ArithmeticTwapPriceBetweenTime queries -// the time weight average price of specific -// denom between period of Time -// Where the period is defined by user by define startTime and endTime -func (q querier) ArithmeticTwapPriceBetweenTime( - goCtx context.Context, - req *types.QueryArithmeticTwapPriceBetweenTime, -) (*types.QueryArithmeticTwapPriceBetweenTimeResponse, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "empty request") - } - - ctx := sdk.UnwrapSDKContext(goCtx) - _, found := q.IsInTrackingList(ctx, req.Denom) - if !found { - return nil, status.Errorf(codes.InvalidArgument, "Denom %s not in tracking list", req.Denom) - } - - if req.StartTime.After(req.EndTime) { - return nil, status.Errorf(codes.InvalidArgument, "StartTime %v after Endtime %v", req.StartTime, req.EndTime) - } - - twapPrice, err := q.GetArithmetricTWAP(ctx, req.Denom, req.StartTime, req.EndTime) - if err != nil { - return nil, err - } - - return &types.QueryArithmeticTwapPriceBetweenTimeResponse{ - TwapPrice: sdk.NewDecCoinFromDec(req.Denom, twapPrice), - }, nil -} diff --git a/x/oracle/keeper/grpc_query_test.go b/x/oracle/keeper/grpc_query_test.go deleted file mode 100644 index 553ecc0c8..000000000 --- a/x/oracle/keeper/grpc_query_test.go +++ /dev/null @@ -1,513 +0,0 @@ -package keeper_test - -import ( - "math/rand" - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/query" - "github.com/tendermint/tendermint/crypto/secp256k1" - - appparams "github.com/CosmosContracts/juno/v13/app/params" - "github.com/CosmosContracts/juno/v13/testutil/nullify" - "github.com/CosmosContracts/juno/v13/x/oracle/keeper" - "github.com/CosmosContracts/juno/v13/x/oracle/types" -) - -func (s *IntegrationTestSuite) TestQuerier_ActiveExchangeRates() { - s.app.OracleKeeper.SetExchangeRate(s.ctx, displayDenom, sdk.OneDec()) - res, err := s.queryClient.ActiveExchangeRates(s.ctx.Context(), &types.QueryActiveExchangeRates{}) - s.Require().NoError(err) - s.Require().Equal([]string{displayDenom}, res.ActiveRates) -} - -func (s *IntegrationTestSuite) TestQuerier_ExchangeRates() { - s.app.OracleKeeper.SetExchangeRate(s.ctx, displayDenom, sdk.OneDec()) - res, err := s.queryClient.ExchangeRates(s.ctx.Context(), &types.QueryExchangeRates{}) - s.Require().NoError(err) - s.Require().Equal(sdk.DecCoins{ - sdk.NewDecCoinFromDec(displayDenom, sdk.OneDec()), - }, res.ExchangeRates) - - res, err = s.queryClient.ExchangeRates(s.ctx.Context(), &types.QueryExchangeRates{ - Denom: displayDenom, - }) - s.Require().NoError(err) - s.Require().Equal(sdk.DecCoins{ - sdk.NewDecCoinFromDec(displayDenom, sdk.OneDec()), - }, res.ExchangeRates) -} - -func (s *IntegrationTestSuite) TestQuerier_FeeederDelegation() { - feederAddr := sdk.AccAddress([]byte("addr________________")) - feederAcc := s.app.AccountKeeper.NewAccountWithAddress(s.ctx, feederAddr) - inactiveValidator := sdk.ValAddress(secp256k1.GenPrivKey().PubKey().Address()).String() - s.app.AccountKeeper.SetAccount(s.ctx, feederAcc) - - err := s.app.OracleKeeper.ValidateFeeder(s.ctx, feederAddr, valAddr) - s.Require().Error(err) - - _, err = s.queryClient.FeederDelegation(s.ctx.Context(), &types.QueryFeederDelegation{ - ValidatorAddr: inactiveValidator, - }) - s.Require().Error(err) - - s.app.OracleKeeper.SetFeederDelegation(s.ctx, valAddr, feederAddr) - - err = s.app.OracleKeeper.ValidateFeeder(s.ctx, feederAddr, valAddr) - s.Require().NoError(err) - - res, err := s.queryClient.FeederDelegation(s.ctx.Context(), &types.QueryFeederDelegation{ - ValidatorAddr: valAddr.String(), - }) - s.Require().NoError(err) - s.Require().Equal(feederAddr.String(), res.FeederAddr) -} - -func (s *IntegrationTestSuite) TestQuerier_MissCounter() { - missCounter := uint64(rand.Intn(100)) - - res, err := s.queryClient.MissCounter(s.ctx.Context(), &types.QueryMissCounter{ - ValidatorAddr: valAddr.String(), - }) - s.Require().NoError(err) - s.Require().Equal(res.MissCounter, uint64(0)) - - s.app.OracleKeeper.SetMissCounter(s.ctx, valAddr, missCounter) - - res, err = s.queryClient.MissCounter(s.ctx.Context(), &types.QueryMissCounter{ - ValidatorAddr: valAddr.String(), - }) - s.Require().NoError(err) - s.Require().Equal(res.MissCounter, missCounter) -} - -func (s *IntegrationTestSuite) TestQuerier_SlashWindow() { - res, err := s.queryClient.SlashWindow(s.ctx.Context(), &types.QuerySlashWindow{}) - s.Require().NoError(err) - s.Require().Equal(uint64(1), res.WindowProgress) -} - -func (s *IntegrationTestSuite) TestQuerier_AggregatePrevote() { - prevote := types.AggregateExchangeRatePrevote{ - Hash: "hash", - Voter: addr.String(), - SubmitBlock: 0, - } - s.app.OracleKeeper.SetAggregateExchangeRatePrevote(s.ctx, valAddr, prevote) - - res, err := s.app.OracleKeeper.GetAggregateExchangeRatePrevote(s.ctx, valAddr) - s.Require().NoError(err) - s.Require().Equal(prevote, res) - - queryRes, err := s.queryClient.AggregatePrevote(s.ctx.Context(), &types.QueryAggregatePrevote{ - ValidatorAddr: valAddr.String(), - }) - s.Require().NoError(err) - s.Require().Equal(types.AggregateExchangeRatePrevote{ - Hash: "hash", - Voter: addr.String(), - SubmitBlock: 0, - }, queryRes.AggregatePrevote) -} - -func (s *IntegrationTestSuite) TestQuerier_AggregatePrevotes() { - res, err := s.queryClient.AggregatePrevotes(s.ctx.Context(), &types.QueryAggregatePrevotes{}) - s.Require().Equal([]types.AggregateExchangeRatePrevote(nil), res.AggregatePrevotes) - s.Require().NoError(err) -} - -func (s *IntegrationTestSuite) TestQuerier_AggregateVote() { - var tuples types.ExchangeRateTuples - tuples = append(tuples, types.ExchangeRateTuple{ - Denom: appparams.DisplayDenom, - ExchangeRate: sdk.ZeroDec(), - }) - - vote := types.AggregateExchangeRateVote{ - ExchangeRateTuples: tuples, - Voter: addr.String(), - } - s.app.OracleKeeper.SetAggregateExchangeRateVote(s.ctx, valAddr, vote) - - res, err := s.queryClient.AggregateVote(s.ctx.Context(), &types.QueryAggregateVote{ - ValidatorAddr: valAddr.String(), - }) - s.Require().NoError(err) - s.Require().Equal(types.AggregateExchangeRateVote{ - ExchangeRateTuples: tuples, - Voter: addr.String(), - }, res.AggregateVote) -} - -func (s *IntegrationTestSuite) TestQuerier_AggregateVotes() { - res, err := s.queryClient.AggregateVotes(s.ctx.Context(), &types.QueryAggregateVotes{}) - s.Require().NoError(err) - s.Require().Equal([]types.AggregateExchangeRateVote(nil), res.AggregateVotes) -} - -func (s *IntegrationTestSuite) TestQuerier_AggregateVoteInvalidExchangeRate() { - res, err := s.queryClient.AggregateVote(s.ctx.Context(), &types.QueryAggregateVote{ - ValidatorAddr: valAddr.String(), - }) - s.Require().Nil(res) - s.Require().ErrorContains(err, "no aggregate vote") -} - -func (s *IntegrationTestSuite) TestQuerier_AggregatePrevoteInvalidExchangeRate() { - res, err := s.queryClient.AggregatePrevote(s.ctx.Context(), &types.QueryAggregatePrevote{ - ValidatorAddr: valAddr.String(), - }) - s.Require().Nil(res) - s.Require().ErrorContains(err, "no aggregate prevote") -} - -func (s *IntegrationTestSuite) TestQuerier_Params() { - res, err := s.queryClient.Params(s.ctx.Context(), &types.QueryParams{}) - s.Require().NoError(err) - s.Require().Equal(types.DefaultGenesisState().Params, res.Params) -} - -func (s *IntegrationTestSuite) TestQuerier_ExchangeRatesInvalidExchangeRate() { - resExchangeRate, err := s.queryClient.ExchangeRates(s.ctx.Context(), &types.QueryExchangeRates{ - Denom: " ", - }) - s.Require().Nil(resExchangeRate) - s.Require().ErrorContains(err, "unknown denom") -} - -func (s *IntegrationTestSuite) TestQuerier_AggregatePrevoteInvalidValAddr() { - resExchangeRate, err := s.queryClient.AggregatePrevote(s.ctx.Context(), &types.QueryAggregatePrevote{ - ValidatorAddr: "valAddrInvalid", - }) - s.Require().Nil(resExchangeRate) - s.Require().ErrorContains(err, "decoding bech32 failed") -} - -func (s *IntegrationTestSuite) TestQuerier_AggregatePrevotesAppendVotes() { - s.app.OracleKeeper.SetAggregateExchangeRatePrevote(s.ctx, valAddr, types.NewAggregateExchangeRatePrevote( - types.AggregateVoteHash{}, - valAddr, - uint64(s.ctx.BlockHeight()), - )) - - _, err := s.queryClient.AggregatePrevotes(s.ctx.Context(), &types.QueryAggregatePrevotes{}) - s.Require().Nil(err) -} - -func (s *IntegrationTestSuite) TestQuerier_AggregateVotesAppendVotes() { - s.app.OracleKeeper.SetAggregateExchangeRateVote(s.ctx, valAddr, types.NewAggregateExchangeRateVote( - types.DefaultGenesisState().ExchangeRates, - valAddr, - )) - - _, err := s.queryClient.AggregateVotes(s.ctx.Context(), &types.QueryAggregateVotes{}) - s.Require().Nil(err) -} - -func (s *IntegrationTestSuite) TestEmptyRequest() { - q := keeper.NewQuerier(keeper.Keeper{}) - const emptyRequestErrorMsg = "empty request" - - resParams, err := q.Params(s.ctx.Context(), nil) - s.Require().Nil(resParams) - s.Require().ErrorContains(err, emptyRequestErrorMsg) - - resExchangeRate, err := q.ExchangeRates(s.ctx.Context(), nil) - s.Require().Nil(resExchangeRate) - s.Require().ErrorContains(err, emptyRequestErrorMsg) - - resActiveExchangeRates, err := q.ActiveExchangeRates(s.ctx.Context(), nil) - s.Require().Nil(resActiveExchangeRates) - s.Require().ErrorContains(err, emptyRequestErrorMsg) - - resFeederDelegation, err := q.FeederDelegation(s.ctx.Context(), nil) - s.Require().Nil(resFeederDelegation) - s.Require().ErrorContains(err, emptyRequestErrorMsg) - - resMissCounter, err := q.MissCounter(s.ctx.Context(), nil) - s.Require().Nil(resMissCounter) - s.Require().ErrorContains(err, emptyRequestErrorMsg) - - resAggregatePrevote, err := q.AggregatePrevote(s.ctx.Context(), nil) - s.Require().Nil(resAggregatePrevote) - s.Require().ErrorContains(err, emptyRequestErrorMsg) - - resAggregatePrevotes, err := q.AggregatePrevotes(s.ctx.Context(), nil) - s.Require().Nil(resAggregatePrevotes) - s.Require().ErrorContains(err, emptyRequestErrorMsg) - - resAggregateVote, err := q.AggregateVote(s.ctx.Context(), nil) - s.Require().Nil(resAggregateVote) - s.Require().ErrorContains(err, emptyRequestErrorMsg) - - resAggregateVotes, err := q.AggregateVotes(s.ctx.Context(), nil) - s.Require().Nil(resAggregateVotes) - s.Require().ErrorContains(err, emptyRequestErrorMsg) -} - -func (s *IntegrationTestSuite) TestInvalidBechAddress() { - q := keeper.NewQuerier(keeper.Keeper{}) - invalidAddressMsg := "empty address string is not allowed" - - resFeederDelegation, err := q.FeederDelegation(s.ctx.Context(), &types.QueryFeederDelegation{}) - s.Require().Nil(resFeederDelegation) - s.Require().ErrorContains(err, invalidAddressMsg) - - resMissCounter, err := q.MissCounter(s.ctx.Context(), &types.QueryMissCounter{}) - s.Require().Nil(resMissCounter) - s.Require().ErrorContains(err, invalidAddressMsg) - - resAggregatePrevote, err := q.AggregatePrevote(s.ctx.Context(), &types.QueryAggregatePrevote{}) - s.Require().Nil(resAggregatePrevote) - s.Require().ErrorContains(err, invalidAddressMsg) - - resAggregateVote, err := q.AggregateVote(s.ctx.Context(), &types.QueryAggregateVote{}) - s.Require().Nil(resAggregateVote) - s.Require().ErrorContains(err, invalidAddressMsg) -} - -func (s *IntegrationTestSuite) TestQueryTwapTrackingLists() { - s.SetupTest() - - res, err := s.queryClient.TwapTrackingLists(s.ctx.Context(), &types.QueryTwapTrackingLists{}) - s.Require().NoError(err) - s.Require().NotNil(res) - - result := []string{"JUNO", "ATOM"} // default params - - s.Require().Equal(res.TwapTrackingLists, result) -} - -func (s *IntegrationTestSuite) TestPriceHistoryAtTime() { - s.SetupTest() - timeNow := time.Now().UTC() - - phEntry := types.PriceHistoryEntry{ - Price: sdk.OneDec(), - VotePeriodCount: 10, - PriceUpdateTime: timeNow, - } - - s.app.OracleKeeper.SetPriceHistoryEntry( - s.ctx, - "JUNO", - phEntry.PriceUpdateTime, - phEntry.Price, - phEntry.VotePeriodCount, - ) - - req := &types.QueryPriceHistoryAtTime{ - Denom: "JUNO", - Time: timeNow, - } - - res, err := s.queryClient.PriceHistoryAtTime(s.ctx.Context(), req) - s.Require().NoError(err) - s.Require().Equal(phEntry, res.PriceHistoryEntry) - - req = &types.QueryPriceHistoryAtTime{ - Denom: "JUNO", - Time: timeNow.Add(time.Minute), - } - - res, err = s.queryClient.PriceHistoryAtTime(s.ctx.Context(), req) - s.Require().NoError(err) - s.Require().Equal(phEntry, res.PriceHistoryEntry) -} - -func (s *IntegrationTestSuite) TestAllPriceHistory() { - s.SetupTest() - timeNow := time.Now().UTC() - - phEntrys := []types.PriceHistoryEntry{ - { - Price: sdk.OneDec(), - VotePeriodCount: 1, - PriceUpdateTime: timeNow, - }, - { - Price: sdk.OneDec(), - VotePeriodCount: 11, - PriceUpdateTime: timeNow.Add(time.Minute), - }, - { - Price: sdk.OneDec(), - VotePeriodCount: 12, - PriceUpdateTime: timeNow.Add(2 * time.Minute), - }, - { - Price: sdk.OneDec(), - VotePeriodCount: 13, - PriceUpdateTime: timeNow.Add(3 * time.Minute), - }, - { - Price: sdk.OneDec(), - VotePeriodCount: 14, - PriceUpdateTime: timeNow.Add(4 * time.Minute), - }, - } - - // Set price history - for _, phEntry := range phEntrys { - s.app.OracleKeeper.SetPriceHistoryEntry( - s.ctx, - "JUNO", - phEntry.PriceUpdateTime, - phEntry.Price, - phEntry.VotePeriodCount, - ) - } - - // Get price history - request := func(next []byte, offset, limit uint64, total bool) *types.QueryAllPriceHistory { - return &types.QueryAllPriceHistory{ - Denom: "JUNO", - Pagination: &query.PageRequest{ - Key: next, - Offset: offset, - Limit: limit, - CountTotal: total, - }, - } - } - - s.Run("ByOffset", func() { - step := 2 - goCtx := sdk.WrapSDKContext(s.ctx) - for i := 0; i < len(phEntrys); i += step { - resp, err := s.queryClient.AllPriceHistory(goCtx, request(nil, uint64(i), uint64(step), false)) - s.Require().NoError(err) - s.Require().LessOrEqual(len(resp.PriceHistoryEntrys), step) - s.Require().Subset(nullify.Fill(phEntrys), nullify.Fill(resp.PriceHistoryEntrys)) - } - }) - s.Run("ByKey", func() { - step := 2 - var next []byte - goCtx := sdk.WrapSDKContext(s.ctx) - for i := 0; i < len(phEntrys); i += step { - resp, err := s.queryClient.AllPriceHistory(goCtx, request(next, 0, uint64(step), false)) - s.Require().NoError(err) - s.Require().LessOrEqual(len(resp.PriceHistoryEntrys), step) - s.Require().Subset(nullify.Fill(phEntrys), nullify.Fill(resp.PriceHistoryEntrys)) - next = resp.Pagination.NextKey - } - }) - s.Run("Total", func() { - goCtx := sdk.WrapSDKContext(s.ctx) - resp, err := s.queryClient.AllPriceHistory(goCtx, request(nil, 0, 0, true)) - s.Require().NoError(err) - s.Require().Equal(len(phEntrys), int(resp.Pagination.Total)) - s.Require().ElementsMatch(nullify.Fill(phEntrys), nullify.Fill(resp.PriceHistoryEntrys)) - }) -} - -func (s *IntegrationTestSuite) TestArithmeticTwapPriceBetweenTime() { - s.SetupTest() - timeNow := time.Now().UTC() - - phEntrys := []types.PriceHistoryEntry{ - { - Price: sdk.OneDec(), - VotePeriodCount: 10, - PriceUpdateTime: timeNow, - }, - { - Price: sdk.OneDec(), - VotePeriodCount: 11, - PriceUpdateTime: timeNow.Add(time.Minute), - }, - { - Price: sdk.OneDec(), - VotePeriodCount: 12, - PriceUpdateTime: timeNow.Add(2 * time.Minute), - }, - { - Price: sdk.OneDec(), - VotePeriodCount: 13, - PriceUpdateTime: timeNow.Add(3 * time.Minute), - }, - { - Price: sdk.OneDec(), - VotePeriodCount: 14, - PriceUpdateTime: timeNow.Add(4 * time.Minute), - }, - } - - // Set price history - for _, phEntry := range phEntrys { - s.app.OracleKeeper.SetPriceHistoryEntry( - s.ctx, - "JUNO", - phEntry.PriceUpdateTime, - phEntry.Price, - phEntry.VotePeriodCount, - ) - } - - for _, tc := range []struct { - desc string - req *types.QueryArithmeticTwapPriceBetweenTime - res *types.QueryArithmeticTwapPriceBetweenTimeResponse - shouldErr bool - }{ - { - desc: "Success", - req: &types.QueryArithmeticTwapPriceBetweenTime{ - Denom: "JUNO", - StartTime: timeNow, - EndTime: timeNow.Add(4 * time.Minute), - }, - res: &types.QueryArithmeticTwapPriceBetweenTimeResponse{ - TwapPrice: sdk.NewDecCoinFromDec("JUNO", sdk.OneDec()), - }, - shouldErr: false, - }, - { - desc: "Success", - req: &types.QueryArithmeticTwapPriceBetweenTime{ - Denom: "JUNO", - StartTime: timeNow.Add(30 * time.Second), - EndTime: timeNow.Add(4 * time.Minute), - }, - res: &types.QueryArithmeticTwapPriceBetweenTimeResponse{ - TwapPrice: sdk.NewDecCoinFromDec("JUNO", sdk.OneDec()), - }, - shouldErr: false, - }, - { - desc: "Success - Start time before first entry", - req: &types.QueryArithmeticTwapPriceBetweenTime{ - Denom: "JUNO", - StartTime: timeNow.Add(-time.Minute), - EndTime: timeNow.Add(4 * time.Minute), - }, - res: &types.QueryArithmeticTwapPriceBetweenTimeResponse{ - TwapPrice: sdk.NewDecCoinFromDec("JUNO", sdk.OneDec()), - }, - shouldErr: false, - }, - { - desc: "Error - End time before start time", - req: &types.QueryArithmeticTwapPriceBetweenTime{ - Denom: "JUNO", - StartTime: timeNow.Add(3 * time.Minute), - EndTime: timeNow.Add(2 * time.Minute), - }, - shouldErr: true, - }, - } { - tc := tc - s.Run(tc.desc, func() { - if !tc.shouldErr { - res, err := s.queryClient.ArithmeticTwapPriceBetweenTime(s.ctx.Context(), tc.req) - s.Require().NoError(err) - s.Require().Equal(tc.res, res) - } else { - _, err := s.queryClient.ArithmeticTwapPriceBetweenTime(s.ctx.Context(), tc.req) - s.Require().Error(err) - } - }) - } -} diff --git a/x/oracle/keeper/history.go b/x/oracle/keeper/history.go deleted file mode 100644 index 608be625f..000000000 --- a/x/oracle/keeper/history.go +++ /dev/null @@ -1,192 +0,0 @@ -package keeper - -import ( - "errors" - "fmt" - "strings" - "time" - - "github.com/CosmosContracts/juno/v13/x/oracle/types" - "github.com/CosmosContracts/juno/v13/x/oracle/util" - sdk "github.com/cosmos/cosmos-sdk/types" -) - -// storeHistorical data writes to the store, in all needed indexing. -func (k Keeper) storeHistoricalData(ctx sdk.Context, denom string, entry types.PriceHistoryEntry) { - store := ctx.KVStore(k.storeKey) - key := types.FormatHistoricalDenomIndexKey(entry.PriceUpdateTime, denom) - - bz, err := k.cdc.Marshal(&entry) - if err != nil { - panic(err) - } - - store.Set(key, bz) -} - -// getHistoryEntryAtOrBeforeTime on a given input (denom, t) -// returns the PriceHistoryEntry from state for (denom, t'), -// where t' is such that: -// * t' <= t -// * there exists no `t” <= t` in state, where `t' < t”` -func (k Keeper) getHistoryEntryAtOrBeforeTime(ctx sdk.Context, denom string, t time.Time) (types.PriceHistoryEntry, error) { - store := ctx.KVStore(k.storeKey) - - startKey := types.FormatHistoricalDenomIndexPrefix(denom) - endKey := types.FormatHistoricalDenomIndexKey(t, denom) - reverseIterate := true - - entry, err := util.GetFirstValueInRange(store, startKey, endKey, reverseIterate, k.ParseTwapFromBz) - if err != nil { - return types.PriceHistoryEntry{}, err - } - - return entry, nil -} - -// getFirstEntryBetweenTime on a given input (denom, start, end) -// returns the first PriceHistoryEntry from state for (denom, t'), -// where start <= t' and t' <= end -func (k Keeper) getFirstEntryBetweenTime(ctx sdk.Context, denom string, start time.Time, end time.Time) (entry types.PriceHistoryEntry, err error) { - if start.After(end) { - return types.PriceHistoryEntry{}, errors.New("start time after end time") - } - store := ctx.KVStore(k.storeKey) - - startKey := types.FormatHistoricalDenomIndexKey(start, denom) - endKey := types.FormatHistoricalDenomIndexKey(end, denom) - - reverseIterate := false - - entry, err = util.GetFirstValueInRange(store, startKey, endKey, reverseIterate, k.ParseTwapFromBz) - - if err != nil { - return types.PriceHistoryEntry{}, err - } - - return entry, nil -} - -// getHistoryEntryBetweenTime on a given input (denom, start, end) -// returns all PriceHistoryEntry values from state for (denom, t'), -// where start <= t' and t' <= end -func (k Keeper) getHistoryEntryBetweenTime(ctx sdk.Context, denom string, start time.Time, end time.Time) (entries []types.PriceHistoryEntry, err error) { - if start.After(end) { - return []types.PriceHistoryEntry{}, errors.New("start time after end time") - } - store := ctx.KVStore(k.storeKey) - - startKey := types.FormatHistoricalDenomIndexKey(start, denom) - endKey := types.FormatHistoricalDenomIndexKey(end, denom) - - reverseIterate := false - - entries, err = util.GetValueInRange(store, startKey, endKey, reverseIterate, k.ParseTwapFromBz) - - if err != nil { - return []types.PriceHistoryEntry{}, err - } - - return entries, nil -} - -func (k Keeper) ParseTwapFromBz(bz []byte) (entry types.PriceHistoryEntry, err error) { - if len(bz) == 0 { - return types.PriceHistoryEntry{}, errors.New("history entry not found") - } - err = k.cdc.Unmarshal(bz, &entry) - return entry, err -} - -// RemoveHistoryEntryBeforeTime remove all history entry -// that had UpdatePriceTime before t -func (k Keeper) RemoveHistoryEntryBeforeTime(ctx sdk.Context, denom string, t time.Time) { - store := ctx.KVStore(k.storeKey) - - startKey := types.FormatHistoricalDenomIndexPrefix(denom) - endKey := types.FormatHistoricalDenomIndexKey(t, denom) - reverseIterate := true - - util.RemoveValueInRange(store, startKey, endKey, reverseIterate) -} - -func (k Keeper) SetPriceHistoryEntry(ctx sdk.Context, denom string, t time.Time, exchangeRate sdk.Dec, votingPeriodCount uint64) { - entry := types.PriceHistoryEntry{ - Price: exchangeRate, - VotePeriodCount: votingPeriodCount, - PriceUpdateTime: t, - } - - k.storeHistoricalData(ctx, denom, entry) -} - -// GetArithmetricTWAP get the arithmetic TWAP -// of specific denom between startTime and endTime -func (k Keeper) GetArithmetricTWAP( - ctx sdk.Context, - denom string, - startTime time.Time, - endTime time.Time, -) (sdk.Dec, error) { - startEntry, err := k.getHistoryEntryAtOrBeforeTime(ctx, denom, startTime) - if err != nil { - if strings.Contains(err.Error(), "no values in range") { - // pick value right after startTime if no value before startTime - startEntryAfter, error := k.getFirstEntryBetweenTime(ctx, denom, startTime, endTime) - if error != nil { - return sdk.Dec{}, error - } - startEntry = startEntryAfter - } else { - return sdk.Dec{}, err - } - } - endEntry, err := k.getHistoryEntryAtOrBeforeTime(ctx, denom, endTime) - if err != nil { - return sdk.Dec{}, err - } - - startEntry.PriceUpdateTime = startTime - endEntry.PriceUpdateTime = endTime - - entryList, err := k.getHistoryEntryBetweenTime(ctx, denom, startTime, endTime) - if err != nil { - return sdk.Dec{}, err - } - - twapPrice, err := k.calculateTWAP(startEntry, entryList, endEntry) - if err != nil { - return sdk.Dec{}, err - } - - return twapPrice, nil -} - -// calculateTWAP calculate TWAP between startEntry and endEntry -func (k Keeper) calculateTWAP(startEntry types.PriceHistoryEntry, entries []types.PriceHistoryEntry, endEntry types.PriceHistoryEntry) (sdk.Dec, error) { - var allEntries []types.PriceHistoryEntry - allEntries = append(allEntries, startEntry) - allEntries = append(allEntries, entries...) - allEntries = append(allEntries, endEntry) - - // Calculate the total time weight multiple with price - total := sdk.ZeroDec() - for i := 0; i < len(allEntries)-1; i++ { - fl64TW := allEntries[i+1].PriceUpdateTime.Sub(allEntries[i].PriceUpdateTime).Seconds() - decTW, err := sdk.NewDecFromStr(fmt.Sprintf("%f", fl64TW)) - if err != nil { - return sdk.Dec{}, nil - } - total = total.Add(allEntries[i].Price.Mul(decTW)) - } - - // Calculate the time weight average price - fl64TotalTW := endEntry.PriceUpdateTime.Sub(startEntry.PriceUpdateTime).Seconds() - decTotalTW, err := sdk.NewDecFromStr(fmt.Sprintf("%f", fl64TotalTW)) - if err != nil { - return sdk.Dec{}, err - } - twapPrice := total.Quo(decTotalTW) - - return twapPrice, nil -} diff --git a/x/oracle/keeper/history_test.go b/x/oracle/keeper/history_test.go deleted file mode 100644 index 6738a5327..000000000 --- a/x/oracle/keeper/history_test.go +++ /dev/null @@ -1,463 +0,0 @@ -package keeper - -import ( - "testing" - "time" - - "github.com/CosmosContracts/juno/v13/x/oracle/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" -) - -func Test_storeHistoricalData(t *testing.T) { - timeNow := time.Now().UTC() - ctx, keepers := CreateTestInput(t, false) - oracleKeeper := keepers.OracleKeeper - - phEntrys := []types.PriceHistoryEntry{ - { - Price: sdk.OneDec(), - VotePeriodCount: 10, - PriceUpdateTime: timeNow, - }, - { - Price: sdk.OneDec(), - VotePeriodCount: 11, - PriceUpdateTime: timeNow.Add(time.Minute * 2), - }, - { - Price: sdk.OneDec(), - VotePeriodCount: 12, - PriceUpdateTime: timeNow.Add(time.Minute * 4), - }, - } - - for _, phEntry := range phEntrys { - oracleKeeper.storeHistoricalData(ctx, "Denom", phEntry) - } - - phStore, err := oracleKeeper.getHistoryEntryAtOrBeforeTime(ctx, "Denom", phEntrys[0].PriceUpdateTime.Add(-time.Minute)) - require.Error(t, err) - require.Equal(t, types.PriceHistoryEntry{}, phStore) - phStore, err = oracleKeeper.getHistoryEntryAtOrBeforeTime(ctx, "Denom", phEntrys[0].PriceUpdateTime) - require.NoError(t, err) - require.Equal(t, phEntrys[0], phStore) - phStore, err = oracleKeeper.getHistoryEntryAtOrBeforeTime(ctx, "Denom", phEntrys[0].PriceUpdateTime.Add(time.Minute)) - require.NoError(t, err) - require.Equal(t, phEntrys[0], phStore) - phStore, err = oracleKeeper.getHistoryEntryAtOrBeforeTime(ctx, "Denom", phEntrys[1].PriceUpdateTime) - require.NoError(t, err) - require.Equal(t, phEntrys[1], phStore) - phStore, err = oracleKeeper.getHistoryEntryAtOrBeforeTime(ctx, "Denom", phEntrys[1].PriceUpdateTime.Add(time.Minute)) - require.NoError(t, err) - require.Equal(t, phEntrys[1], phStore) - - phStores, err := oracleKeeper.getHistoryEntryBetweenTime( - ctx, - "Denom", - phEntrys[0].PriceUpdateTime.Add(-time.Minute), - phEntrys[2].PriceUpdateTime.Add(time.Minute), - ) - require.NoError(t, err) - require.Equal(t, phStores, phEntrys) - - phStores, err = oracleKeeper.getHistoryEntryBetweenTime( - ctx, - "Denom", - phEntrys[0].PriceUpdateTime, - phEntrys[2].PriceUpdateTime, - ) - require.NoError(t, err) - require.Equal(t, phStores, phEntrys) - - phStores, err = oracleKeeper.getHistoryEntryBetweenTime( - ctx, - "Denom", - phEntrys[0].PriceUpdateTime.Add(-time.Minute), - phEntrys[1].PriceUpdateTime, - ) - require.NoError(t, err) - require.Equal(t, 2, len(phStores)) - require.Equal(t, phStores[0], phEntrys[0]) - require.Equal(t, phStores[1], phEntrys[1]) - - phStores, err = oracleKeeper.getHistoryEntryBetweenTime( - ctx, - "Denom", - phEntrys[0].PriceUpdateTime, - phEntrys[2].PriceUpdateTime.Add(-time.Minute), - ) - require.NoError(t, err) - require.Equal(t, 2, len(phStores)) - require.Equal(t, phStores[0], phEntrys[0]) - require.Equal(t, phStores[1], phEntrys[1]) -} - -func Test_getHistoryEntryAtOrBeforeTime(t *testing.T) { - timeNow := time.Now().UTC() - ctx, keepers := CreateTestInput(t, false) - oracleKeeper := keepers.OracleKeeper - - phEntry := types.PriceHistoryEntry{ - Price: sdk.OneDec(), - VotePeriodCount: 10, - PriceUpdateTime: timeNow, - } - oracleKeeper.storeHistoricalData(ctx, "Denom", phEntry) - - for _, tc := range []struct { - desc string - denom string - timeGet time.Time - res types.PriceHistoryEntry - shouldErr bool - }{ - { - desc: "Success - timeGet equal PriceUpdateTime", - denom: "Denom", - timeGet: timeNow, - res: phEntry, - shouldErr: false, - }, - { - desc: "Success - timeGet after PriceUpdateTime", - denom: "Denom", - timeGet: timeNow.Add(time.Minute), - res: phEntry, - shouldErr: false, - }, - { - desc: "Fail - timeGet before PriceUpdateTime", - denom: "Denom", - timeGet: timeNow.Add(-time.Minute), - shouldErr: true, - }, - { - desc: "Fail - Invalid denom", - denom: "Invalid", - timeGet: timeNow, - shouldErr: true, - }, - } { - tc := tc - t.Run(tc.desc, func(t *testing.T) { - if !tc.shouldErr { - res, err := oracleKeeper.getHistoryEntryAtOrBeforeTime(ctx, tc.denom, tc.timeGet) - require.NoError(t, err) - require.Equal(t, tc.res, res) - } else { - _, err := oracleKeeper.getHistoryEntryAtOrBeforeTime(ctx, tc.denom, tc.timeGet) - require.Error(t, err) - } - }) - } -} - -func Test_getHistoryEntryBetweenTime(t *testing.T) { - timeNow := time.Now().UTC() - ctx, keepers := CreateTestInput(t, false) - oracleKeeper := keepers.OracleKeeper - - phEntrys := []types.PriceHistoryEntry{ - { - Price: sdk.OneDec(), - VotePeriodCount: 10, - PriceUpdateTime: timeNow, - }, - { - Price: sdk.OneDec(), - VotePeriodCount: 11, - PriceUpdateTime: timeNow.Add(time.Minute * 2), - }, - { - Price: sdk.OneDec(), - VotePeriodCount: 12, - PriceUpdateTime: timeNow.Add(time.Minute * 4), - }, - } - - for _, phEntry := range phEntrys { - oracleKeeper.storeHistoricalData(ctx, "Denom", phEntry) - } - - for _, tc := range []struct { - desc string - denom string - startTimeGet time.Time - endTimeGet time.Time - res []types.PriceHistoryEntry - shouldErr bool - }{ - { - desc: "Success - startTime < entry 1 < entry 2 < entry 3 < endTime", - denom: "Denom", - startTimeGet: timeNow.Add(-time.Minute), - endTimeGet: timeNow.Add(time.Minute * 5), - res: phEntrys, - shouldErr: false, - }, - { - desc: "Success - startTime = entry 1 < entry 2 < entry 3 = endTime", - denom: "Denom", - startTimeGet: timeNow, - endTimeGet: timeNow.Add(time.Minute * 4), - res: phEntrys, - shouldErr: false, - }, - { - desc: "Success - entry 1 < startTime < entry 2 < entry 3 < endTime", - denom: "Denom", - startTimeGet: timeNow.Add(time.Minute), - endTimeGet: timeNow.Add(time.Minute * 5), - res: []types.PriceHistoryEntry{ - phEntrys[1], - phEntrys[2], - }, - shouldErr: false, - }, - { - desc: "Success - entry 1 < entry 2 < startTime < entry 3 < endTime", - denom: "Denom", - startTimeGet: timeNow.Add(time.Minute * 3), - endTimeGet: timeNow.Add(time.Minute * 5), - res: []types.PriceHistoryEntry{ - phEntrys[2], - }, - shouldErr: false, - }, - { - desc: "Success - entry 1 < entry 2 < startTime < entry 3 < endTime", - denom: "Denom", - startTimeGet: timeNow.Add(time.Minute * 3), - endTimeGet: timeNow.Add(time.Minute * 5), - res: []types.PriceHistoryEntry{ - phEntrys[2], - }, - shouldErr: false, - }, - { - desc: "Success - entry 1 < entry 2 < startTime < entry 3 < endTime", - denom: "Denom", - startTimeGet: timeNow.Add(time.Minute * 3), - endTimeGet: timeNow.Add(time.Minute * 5), - res: []types.PriceHistoryEntry{ - phEntrys[2], - }, - shouldErr: false, - }, - { - desc: "Fail - entry 1 < entry 2 < entry 3 < startTime < endTime - No Value in range", - denom: "Denom", - startTimeGet: timeNow.Add(time.Minute * 5), - endTimeGet: timeNow.Add(time.Minute * 6), - shouldErr: true, - }, - { - desc: "Fail - Invalid denom", - denom: "Invalid", - startTimeGet: timeNow.Add(-time.Minute), - endTimeGet: timeNow.Add(time.Minute * 5), - shouldErr: true, - }, - { - desc: "Fail - Invalid startTime after endTime", - denom: "Denom", - startTimeGet: timeNow.Add(time.Minute * 5), - endTimeGet: timeNow, - shouldErr: true, - }, - } { - tc := tc - t.Run(tc.desc, func(t *testing.T) { - if !tc.shouldErr { - res, err := oracleKeeper.getHistoryEntryBetweenTime(ctx, tc.denom, tc.startTimeGet, tc.endTimeGet) - require.NoError(t, err) - require.Equal(t, tc.res, res) - } else { - _, err := oracleKeeper.getHistoryEntryBetweenTime(ctx, tc.denom, tc.startTimeGet, tc.endTimeGet) - require.Error(t, err) - } - }) - - } -} - -func TestRemoveHistoryEntryBeforeTime(t *testing.T) { - timeNow := time.Now().UTC() - phEntrys := []types.PriceHistoryEntry{ - { - Price: sdk.OneDec(), - VotePeriodCount: 10, - PriceUpdateTime: timeNow, - }, - { - Price: sdk.OneDec(), - VotePeriodCount: 11, - PriceUpdateTime: timeNow.Add(time.Minute * 2), - }, - { - Price: sdk.OneDec(), - VotePeriodCount: 12, - PriceUpdateTime: timeNow.Add(time.Minute * 4), - }, - } - - for _, tc := range []struct { - desc string - deleteTime time.Time - phEntryStorage []types.PriceHistoryEntry - }{ - { - desc: "deleteTime before entryTime", - deleteTime: timeNow.Add(-time.Minute), - phEntryStorage: phEntrys, - }, - { - desc: "deleteTime equal entryTime", - deleteTime: timeNow, - phEntryStorage: phEntrys, - }, - { - desc: "deleteTime after entryTime (1 element - delete phEntrys[0])", - deleteTime: timeNow.Add(time.Minute), - phEntryStorage: []types.PriceHistoryEntry{ - phEntrys[1], - phEntrys[2], - }, - }, - { - desc: "deleteTime after entryTime (all)", - deleteTime: timeNow.Add(time.Minute * 5), - phEntryStorage: []types.PriceHistoryEntry{}, - }, - } { - tc := tc - t.Run(tc.desc, func(t *testing.T) { - ctx, keepers := CreateTestInput(t, false) - oracleKeeper := keepers.OracleKeeper - for _, phEntry := range phEntrys { - oracleKeeper.storeHistoricalData(ctx, "Denom", phEntry) - } - oracleKeeper.RemoveHistoryEntryBeforeTime(ctx, "Denom", tc.deleteTime) - phStores, _ := oracleKeeper.getHistoryEntryBetweenTime( - ctx, - "Denom", - phEntrys[0].PriceUpdateTime, - phEntrys[2].PriceUpdateTime, - ) - require.Equal(t, tc.phEntryStorage, phStores) - }) - } -} - -func TestStoreAndGetMultipleHistoricalData(t *testing.T) { - timeNow := time.Now().UTC() - ctx, keepers := CreateTestInput(t, false) - oracleKeeper := keepers.OracleKeeper - - for _, tc := range []struct { - denom string - phEntries []types.PriceHistoryEntry - }{ - { - denom: "Denom", - phEntries: []types.PriceHistoryEntry{ - { - Price: sdk.OneDec(), - VotePeriodCount: 10, - PriceUpdateTime: timeNow, - }, - { - Price: sdk.OneDec(), - VotePeriodCount: 11, - PriceUpdateTime: timeNow.Add(time.Minute * 2), - }, - { - Price: sdk.OneDec(), - VotePeriodCount: 12, - PriceUpdateTime: timeNow.Add(time.Minute * 4), - }, - }, - }, - { - denom: "Den", - phEntries: []types.PriceHistoryEntry{ - { - Price: sdk.OneDec(), - VotePeriodCount: 100, - PriceUpdateTime: timeNow, - }, - { - Price: sdk.OneDec(), - VotePeriodCount: 101, - PriceUpdateTime: timeNow.Add(time.Minute * 2), - }, - { - Price: sdk.OneDec(), - VotePeriodCount: 102, - PriceUpdateTime: timeNow.Add(time.Minute * 6), - }, - }, - }, - { - denom: "Juno", - phEntries: []types.PriceHistoryEntry{ - { - Price: sdk.OneDec(), - VotePeriodCount: 20, - PriceUpdateTime: timeNow, - }, - { - Price: sdk.OneDec(), - VotePeriodCount: 21, - PriceUpdateTime: timeNow.Add(time.Minute * 3), - }, - { - Price: sdk.OneDec(), - VotePeriodCount: 22, - PriceUpdateTime: timeNow.Add(time.Minute * 9), - }, - }, - }, - } { - for _, phEntry := range tc.phEntries { - oracleKeeper.storeHistoricalData(ctx, tc.denom, phEntry) - } - - phStoreDenom, err := oracleKeeper.getHistoryEntryAtOrBeforeTime(ctx, tc.denom, tc.phEntries[0].PriceUpdateTime.Add(-time.Minute)) - require.Error(t, err) - require.Equal(t, types.PriceHistoryEntry{}, phStoreDenom) - phStoreDenom, err = oracleKeeper.getHistoryEntryAtOrBeforeTime(ctx, tc.denom, tc.phEntries[0].PriceUpdateTime) - require.NoError(t, err) - require.Equal(t, tc.phEntries[0], phStoreDenom) - phStoreDenom, err = oracleKeeper.getHistoryEntryAtOrBeforeTime(ctx, tc.denom, tc.phEntries[0].PriceUpdateTime.Add(time.Minute)) - require.NoError(t, err) - require.Equal(t, tc.phEntries[0], phStoreDenom) - phStoreDenom, err = oracleKeeper.getHistoryEntryAtOrBeforeTime(ctx, tc.denom, tc.phEntries[1].PriceUpdateTime) - require.NoError(t, err) - require.Equal(t, tc.phEntries[1], phStoreDenom) - phStoreDenom, err = oracleKeeper.getHistoryEntryAtOrBeforeTime(ctx, tc.denom, tc.phEntries[1].PriceUpdateTime.Add(time.Minute)) - require.NoError(t, err) - require.Equal(t, tc.phEntries[1], phStoreDenom) - - phStoresDenom, err := oracleKeeper.getHistoryEntryBetweenTime( - ctx, - tc.denom, - tc.phEntries[0].PriceUpdateTime.Add(-time.Minute), - tc.phEntries[2].PriceUpdateTime.Add(time.Minute), - ) - require.NoError(t, err) - require.Equal(t, phStoresDenom, tc.phEntries) - - phStoresDenom, err = oracleKeeper.getHistoryEntryBetweenTime( - ctx, - tc.denom, - tc.phEntries[0].PriceUpdateTime.Add(-time.Minute), - tc.phEntries[1].PriceUpdateTime, - ) - require.NoError(t, err) - require.Equal(t, 2, len(phStoresDenom)) - require.Equal(t, phStoresDenom[0], tc.phEntries[0]) - require.Equal(t, phStoresDenom[1], tc.phEntries[1]) - } -} diff --git a/x/oracle/keeper/keeper.go b/x/oracle/keeper/keeper.go deleted file mode 100644 index 3e728d161..000000000 --- a/x/oracle/keeper/keeper.go +++ /dev/null @@ -1,531 +0,0 @@ -package keeper - -import ( - "fmt" - "strings" - "time" - - "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/store/prefix" - storetypes "github.com/cosmos/cosmos-sdk/store/types" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - gogotypes "github.com/gogo/protobuf/types" - "github.com/tendermint/tendermint/libs/log" - - "github.com/CosmosContracts/juno/v13/x/oracle/types" -) - -var ten = sdk.MustNewDecFromStr("10") - -// Keeper of the oracle store -type Keeper struct { - cdc codec.BinaryCodec - storeKey storetypes.StoreKey - paramSpace paramstypes.Subspace - - accountKeeper types.AccountKeeper - bankKeeper types.BankKeeper - distrKeeper types.DistributionKeeper - StakingKeeper types.StakingKeeper - - distrName string -} - -// NewKeeper constructs a new keeper for oracle -func NewKeeper( - cdc codec.BinaryCodec, - storeKey storetypes.StoreKey, - paramspace paramstypes.Subspace, - accountKeeper types.AccountKeeper, - bankKeeper types.BankKeeper, - distrKeeper types.DistributionKeeper, - stakingKeeper types.StakingKeeper, - distrName string, -) Keeper { - // ensure oracle module account is set - if addr := accountKeeper.GetModuleAddress(types.ModuleName); addr == nil { - panic(fmt.Sprintf("%s module account has not been set", types.ModuleName)) - } - - // set KeyTable if it has not already been set - if !paramspace.HasKeyTable() { - paramspace = paramspace.WithKeyTable(types.ParamKeyTable()) - } - - return Keeper{ - cdc: cdc, - storeKey: storeKey, - paramSpace: paramspace, - accountKeeper: accountKeeper, - bankKeeper: bankKeeper, - distrKeeper: distrKeeper, - StakingKeeper: stakingKeeper, - distrName: distrName, - } -} - -// Logger returns a module-specific logger. -func (k Keeper) Logger(ctx sdk.Context) log.Logger { - return ctx.Logger().With("module", fmt.Sprintf("x/%s", types.ModuleName)) -} - -// Set Price history -func (k Keeper) SetDenomPriceHistory(ctx sdk.Context, symbolDenom string, exchangeRate sdk.Dec, time time.Time, blockHeight uint64) error { - // Check if not in tracking list - upperSymbolDenom := strings.ToUpper(symbolDenom) - _, found := k.IsInTrackingList(ctx, upperSymbolDenom) - if !found { - // if not in tracking list, doing nothing => just return nil - return nil - } - // Calculate voting Period count - params := k.GetParams(ctx) - votingPeriodCount := (blockHeight + 1) / params.VotePeriod - if votingPeriodCount == 0 { - return sdkerrors.Wrap(types.ErrInvalidVotePeriod, "Voting period must be positive") - } - - // Get store - store := ctx.KVStore(k.storeKey) - priceHistoryStore := prefix.NewStore(store, types.GetPriceHistoryKey(upperSymbolDenom)) - - // Store data to store - priceHistoryEntry := &types.PriceHistoryEntry{ - Price: exchangeRate, - VotePeriodCount: votingPeriodCount, - PriceUpdateTime: time, - } - bz, err := k.cdc.Marshal(priceHistoryEntry) - if err != nil { - return err - } - key := sdk.Uint64ToBigEndian(votingPeriodCount) - priceHistoryStore.Set(key, bz) - - return nil -} - -// Get History Price from symbol denom -func (k Keeper) GetDenomPriceHistoryWithBlockHeight(ctx sdk.Context, symbolDenom string, blockHeight uint64) (types.PriceHistoryEntry, error) { - var priceHistoryEntry types.PriceHistoryEntry - // Check if in tracking list - upperSymbolDenom := strings.ToUpper(symbolDenom) - _, found := k.IsInTrackingList(ctx, upperSymbolDenom) - if !found { - return priceHistoryEntry, sdkerrors.Wrapf(types.ErrUnknownDenom, "denom %s not in tracking list", upperSymbolDenom) - } - - // Calculate votingPeriodCount - params := k.GetParams(ctx) - votingPeriodCount := blockHeight / params.VotePeriod - if votingPeriodCount == 0 { - return priceHistoryEntry, sdkerrors.Wrap(types.ErrInvalidVotePeriod, "Voting period must be positive") - } - - // Get store - store := ctx.KVStore(k.storeKey) - priceHistoryStore := prefix.NewStore(store, types.GetPriceHistoryKey(upperSymbolDenom)) - // Get data from store - key := sdk.Uint64ToBigEndian(votingPeriodCount) - bz := priceHistoryStore.Get(key) - if bz == nil { - return priceHistoryEntry, sdkerrors.Wrapf(types.ErrInvalidVotePeriod, "Voting period have no exchange price %d", votingPeriodCount) - } - k.cdc.MustUnmarshal(bz, &priceHistoryEntry) - - return priceHistoryEntry, nil -} - -// Iterate over history price -func (k Keeper) IterateDenomPriceHistory(ctx sdk.Context, symbolDenom string, cb func(uint64, types.PriceHistoryEntry) bool) { - // Get store - upperSymbolDenom := strings.ToUpper(symbolDenom) - store := ctx.KVStore(k.storeKey) - priceHistoryStore := prefix.NewStore(store, types.GetPriceHistoryKey(upperSymbolDenom)) - iter := sdk.KVStorePrefixIterator(priceHistoryStore, []byte{}) - - defer iter.Close() - - for ; iter.Valid(); iter.Next() { - var priceHistoryEntry types.PriceHistoryEntry - k.cdc.MustUnmarshal(iter.Value(), &priceHistoryEntry) - if cb(sdk.BigEndianToUint64(iter.Key()), priceHistoryEntry) { - break - } - } -} - -// Delete denom history price -func (k Keeper) DeleteDenomPriceHistory(ctx sdk.Context, symbolDenom string, votingPeriodCount uint64) { - // Get store - upperSymbolDenom := strings.ToUpper(symbolDenom) - store := ctx.KVStore(k.storeKey) - priceHistoryStore := prefix.NewStore(store, types.GetPriceHistoryKey(upperSymbolDenom)) - // Delete - key := sdk.Uint64ToBigEndian(votingPeriodCount) - priceHistoryStore.Delete(key) -} - -// appendPriceHistory -func (k Keeper) appendPriceHistory(ctx sdk.Context, symbolDenom string, priceHistoryEntrys ...types.PriceHistoryEntry) error { - // Get store - upperSymbolDenom := strings.ToUpper(symbolDenom) - store := ctx.KVStore(k.storeKey) - priceHistoryStore := prefix.NewStore(store, types.GetPriceHistoryKey(upperSymbolDenom)) - - for _, priceHistoryEntry := range priceHistoryEntrys { - priceHistoryEntry := priceHistoryEntry - key := sdk.Uint64ToBigEndian(priceHistoryEntry.VotePeriodCount) - bz, err := k.cdc.Marshal(&priceHistoryEntry) - if err != nil { - return err - } - priceHistoryStore.Set(key, bz) - } - - return nil -} - -// GetExchangeRate gets the consensus exchange rate of USD denominated in the -// denom asset from the store. -func (k Keeper) GetExchangeRate(ctx sdk.Context, symbol string) (sdk.Dec, error) { - store := ctx.KVStore(k.storeKey) - symbol = strings.ToUpper(symbol) - b := store.Get(types.GetExchangeRateKey(symbol)) - if b == nil { - return sdk.ZeroDec(), sdkerrors.Wrap(types.ErrUnknownDenom, symbol) - } - - decProto := sdk.DecProto{} - k.cdc.MustUnmarshal(b, &decProto) - - return decProto.Dec, nil -} - -// GetExchangeRateBase gets the consensus exchange rate of an asset -// in the base denom (e.g. ATOM -> uatom) -func (k Keeper) GetExchangeRateBase(ctx sdk.Context, denom string) (sdk.Dec, error) { - var symbol string - var exponent uint64 - // Translate the base denom -> symbol - params := k.GetParams(ctx) - for _, listDenom := range params.Whitelist { - if listDenom.BaseDenom == denom { - symbol = listDenom.SymbolDenom - exponent = uint64(listDenom.Exponent) - break - } - } - if len(symbol) == 0 { - return sdk.ZeroDec(), sdkerrors.Wrap(types.ErrUnknownDenom, denom) - } - - exchangeRate, err := k.GetExchangeRate(ctx, symbol) - if err != nil { - return sdk.ZeroDec(), err - } - - powerReduction := ten.Power(exponent) - return exchangeRate.Quo(powerReduction), nil -} - -// SetExchangeRate sets the consensus exchange rate of USD denominated in the -// denom asset to the store. -func (k Keeper) SetExchangeRate(ctx sdk.Context, denom string, exchangeRate sdk.Dec) { - store := ctx.KVStore(k.storeKey) - bz := k.cdc.MustMarshal(&sdk.DecProto{Dec: exchangeRate}) - denom = strings.ToUpper(denom) - store.Set(types.GetExchangeRateKey(denom), bz) -} - -// SetExchangeRateWithEvent sets an consensus -// exchange rate to the store with ABCI event -func (k Keeper) SetExchangeRateWithEvent(ctx sdk.Context, denom string, exchangeRate sdk.Dec) error { - k.SetExchangeRate(ctx, denom, exchangeRate) - return ctx.EventManager().EmitTypedEvent(&types.EventSetFxRate{ - Denom: denom, Rate: exchangeRate, - }) -} - -// IterateExchangeRates iterates over USD rates in the store. -func (k Keeper) IterateExchangeRates(ctx sdk.Context, handler func(string, sdk.Dec) bool) { - store := ctx.KVStore(k.storeKey) - - iter := sdk.KVStorePrefixIterator(store, types.KeyPrefixExchangeRate) - defer iter.Close() - - for ; iter.Valid(); iter.Next() { - key := iter.Key() - denom := string(key[len(types.KeyPrefixExchangeRate) : len(key)-1]) - dp := sdk.DecProto{} - - k.cdc.MustUnmarshal(iter.Value(), &dp) - if handler(denom, dp.Dec) { - break - } - } -} - -func (k Keeper) ClearExchangeRates(ctx sdk.Context) { - store := ctx.KVStore(k.storeKey) - iter := sdk.KVStorePrefixIterator(store, types.KeyPrefixExchangeRate) - defer iter.Close() - for ; iter.Valid(); iter.Next() { - store.Delete(iter.Key()) - } -} - -// GetFeederDelegation gets the account address to which the validator operator -// delegated oracle vote rights. -func (k Keeper) GetFeederDelegation(ctx sdk.Context, vAddr sdk.ValAddress) (sdk.AccAddress, error) { - // check that the given validator exists - if val := k.StakingKeeper.Validator(ctx, vAddr); val == nil || !val.IsBonded() { - return nil, stakingtypes.ErrNoValidatorFound.Wrapf("validator %s is not in active set", vAddr) - } - - store := ctx.KVStore(k.storeKey) - bz := store.Get(types.GetFeederDelegationKey(vAddr)) - if bz == nil { - // no delegation, so validator itself must provide price feed - return sdk.AccAddress(vAddr), nil - } - return sdk.AccAddress(bz), nil -} - -// SetFeederDelegation sets the account address to which the validator operator -// delegated oracle vote rights. -func (k Keeper) SetFeederDelegation(ctx sdk.Context, operator sdk.ValAddress, delegatedFeeder sdk.AccAddress) { - store := ctx.KVStore(k.storeKey) - store.Set(types.GetFeederDelegationKey(operator), delegatedFeeder.Bytes()) -} - -type IterateFeederDelegationHandler func(delegator sdk.ValAddress, delegate sdk.AccAddress) (stop bool) - -// IterateFeederDelegations iterates over the feed delegates and performs a -// callback function. -func (k Keeper) IterateFeederDelegations(ctx sdk.Context, handler IterateFeederDelegationHandler) { - store := ctx.KVStore(k.storeKey) - - iter := sdk.KVStorePrefixIterator(store, types.KeyPrefixFeederDelegation) - defer iter.Close() - - for ; iter.Valid(); iter.Next() { - delegator := sdk.ValAddress(iter.Key()[2:]) - delegate := sdk.AccAddress(iter.Value()) - - if handler(delegator, delegate) { - break - } - } -} - -// GetMissCounter retrieves the # of vote periods missed in this oracle slash -// window. -func (k Keeper) GetMissCounter(ctx sdk.Context, operator sdk.ValAddress) uint64 { - store := ctx.KVStore(k.storeKey) - - bz := store.Get(types.GetMissCounterKey(operator)) - if bz == nil { - // by default the counter is zero - return 0 - } - - var missCounter gogotypes.UInt64Value - k.cdc.MustUnmarshal(bz, &missCounter) - - return missCounter.Value -} - -// SetMissCounter updates the # of vote periods missed in this oracle slash -// window. -func (k Keeper) SetMissCounter(ctx sdk.Context, operator sdk.ValAddress, missCounter uint64) { - store := ctx.KVStore(k.storeKey) - bz := k.cdc.MustMarshal(&gogotypes.UInt64Value{Value: missCounter}) - store.Set(types.GetMissCounterKey(operator), bz) -} - -// DeleteMissCounter removes miss counter for the validator. -func (k Keeper) DeleteMissCounter(ctx sdk.Context, operator sdk.ValAddress) { - store := ctx.KVStore(k.storeKey) - store.Delete(types.GetMissCounterKey(operator)) -} - -// IterateMissCounters iterates over the miss counters and performs a callback -// function. -func (k Keeper) IterateMissCounters(ctx sdk.Context, handler func(sdk.ValAddress, uint64) bool) { - store := ctx.KVStore(k.storeKey) - - iter := sdk.KVStorePrefixIterator(store, types.KeyPrefixMissCounter) - defer iter.Close() - - for ; iter.Valid(); iter.Next() { - operator := sdk.ValAddress(iter.Key()[2:]) - - var missCounter gogotypes.UInt64Value - k.cdc.MustUnmarshal(iter.Value(), &missCounter) - - if handler(operator, missCounter.Value) { - break - } - } -} - -// GetAggregateExchangeRatePrevote retrieves an oracle prevote from the store. -func (k Keeper) GetAggregateExchangeRatePrevote( - ctx sdk.Context, - voter sdk.ValAddress, -) (types.AggregateExchangeRatePrevote, error) { - store := ctx.KVStore(k.storeKey) - - bz := store.Get(types.GetAggregateExchangeRatePrevoteKey(voter)) - if bz == nil { - return types.AggregateExchangeRatePrevote{}, sdkerrors.Wrap(types.ErrNoAggregatePrevote, voter.String()) - } - - var aggregatePrevote types.AggregateExchangeRatePrevote - k.cdc.MustUnmarshal(bz, &aggregatePrevote) - - return aggregatePrevote, nil -} - -// HasAggregateExchangeRatePrevote checks if a validator has an existing prevote. -func (k Keeper) HasAggregateExchangeRatePrevote( - ctx sdk.Context, - voter sdk.ValAddress, -) bool { - store := ctx.KVStore(k.storeKey) - return store.Has(types.GetAggregateExchangeRatePrevoteKey(voter)) -} - -// SetAggregateExchangeRatePrevote set an oracle aggregate prevote to the store. -func (k Keeper) SetAggregateExchangeRatePrevote( - ctx sdk.Context, - voter sdk.ValAddress, - prevote types.AggregateExchangeRatePrevote, -) { - store := ctx.KVStore(k.storeKey) - - bz := k.cdc.MustMarshal(&prevote) - store.Set(types.GetAggregateExchangeRatePrevoteKey(voter), bz) -} - -// DeleteAggregateExchangeRatePrevote deletes an oracle prevote from the store. -func (k Keeper) DeleteAggregateExchangeRatePrevote(ctx sdk.Context, voter sdk.ValAddress) { - store := ctx.KVStore(k.storeKey) - store.Delete(types.GetAggregateExchangeRatePrevoteKey(voter)) -} - -// IterateAggregateExchangeRatePrevotes iterates rate over prevotes in the store -func (k Keeper) IterateAggregateExchangeRatePrevotes( - ctx sdk.Context, - handler func(sdk.ValAddress, types.AggregateExchangeRatePrevote) bool, -) { - store := ctx.KVStore(k.storeKey) - - iter := sdk.KVStorePrefixIterator(store, types.KeyPrefixAggregateExchangeRatePrevote) - defer iter.Close() - - for ; iter.Valid(); iter.Next() { - voterAddr := sdk.ValAddress(iter.Key()[2:]) - - var aggregatePrevote types.AggregateExchangeRatePrevote - k.cdc.MustUnmarshal(iter.Value(), &aggregatePrevote) - - if handler(voterAddr, aggregatePrevote) { - break - } - } -} - -// GetAggregateExchangeRateVote retrieves an oracle prevote from the store. -func (k Keeper) GetAggregateExchangeRateVote( - ctx sdk.Context, - voter sdk.ValAddress, -) (types.AggregateExchangeRateVote, error) { - store := ctx.KVStore(k.storeKey) - - bz := store.Get(types.GetAggregateExchangeRateVoteKey(voter)) - if bz == nil { - return types.AggregateExchangeRateVote{}, sdkerrors.Wrap(types.ErrNoAggregateVote, voter.String()) - } - - var aggregateVote types.AggregateExchangeRateVote - k.cdc.MustUnmarshal(bz, &aggregateVote) - - return aggregateVote, nil -} - -// SetAggregateExchangeRateVote adds an oracle aggregate prevote to the store. -func (k Keeper) SetAggregateExchangeRateVote( - ctx sdk.Context, - voter sdk.ValAddress, - vote types.AggregateExchangeRateVote, -) { - store := ctx.KVStore(k.storeKey) - - bz := k.cdc.MustMarshal(&vote) - store.Set(types.GetAggregateExchangeRateVoteKey(voter), bz) -} - -// DeleteAggregateExchangeRateVote deletes an oracle prevote from the store. -func (k Keeper) DeleteAggregateExchangeRateVote(ctx sdk.Context, voter sdk.ValAddress) { - store := ctx.KVStore(k.storeKey) - store.Delete(types.GetAggregateExchangeRateVoteKey(voter)) -} - -type IterateExchangeRateVote = func( - voterAddr sdk.ValAddress, - aggregateVote types.AggregateExchangeRateVote, -) (stop bool) - -// IterateAggregateExchangeRateVotes iterates rate over prevotes in the store. -func (k Keeper) IterateAggregateExchangeRateVotes( - ctx sdk.Context, - handler IterateExchangeRateVote, -) { - store := ctx.KVStore(k.storeKey) - - iter := sdk.KVStorePrefixIterator(store, types.KeyPrefixAggregateExchangeRateVote) - defer iter.Close() - - for ; iter.Valid(); iter.Next() { - voterAddr := sdk.ValAddress(iter.Key()[2:]) - - var aggregateVote types.AggregateExchangeRateVote - k.cdc.MustUnmarshal(iter.Value(), &aggregateVote) - - if handler(voterAddr, aggregateVote) { - break - } - } -} - -// ValidateFeeder returns error if the given feeder is not allowed to feed the message. -func (k Keeper) ValidateFeeder(ctx sdk.Context, feederAddr sdk.AccAddress, valAddr sdk.ValAddress) error { - delegate, err := k.GetFeederDelegation(ctx, valAddr) - if err != nil { - return err - } - if !delegate.Equals(feederAddr) { - return sdkerrors.Wrap(types.ErrNoVotingPermission, feederAddr.String()) - } - - return nil -} - -func (k Keeper) IsInTrackingList(ctx sdk.Context, symbolDenom string) (types.Denom, bool) { - var denom types.Denom - upperSymbolDenom := strings.ToUpper(symbolDenom) - params := k.GetParams(ctx) - for _, trackingDenom := range params.TwapTrackingList { - if trackingDenom.SymbolDenom == upperSymbolDenom { - denom = trackingDenom - return denom, true - } - } - - return denom, false -} diff --git a/x/oracle/keeper/keeper_test.go b/x/oracle/keeper/keeper_test.go deleted file mode 100644 index be000f84e..000000000 --- a/x/oracle/keeper/keeper_test.go +++ /dev/null @@ -1,403 +0,0 @@ -package keeper_test - -import ( - "fmt" - "math/rand" - "sort" - "strings" - "testing" - "time" - - "github.com/cosmos/cosmos-sdk/baseapp" - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - "github.com/cosmos/cosmos-sdk/simapp" - sdk "github.com/cosmos/cosmos-sdk/types" - minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" - "github.com/cosmos/cosmos-sdk/x/staking" - "github.com/cosmos/cosmos-sdk/x/staking/teststaking" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/stretchr/testify/suite" - "github.com/tendermint/tendermint/crypto/secp256k1" - tmrand "github.com/tendermint/tendermint/libs/rand" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - - junoApp "github.com/CosmosContracts/juno/v13/app" - appparams "github.com/CosmosContracts/juno/v13/app/params" - "github.com/CosmosContracts/juno/v13/x/oracle/keeper" - "github.com/CosmosContracts/juno/v13/x/oracle/types" -) - -const ( - displayDenom string = appparams.DisplayDenom - bondDenom string = appparams.BondDenom -) - -type IntegrationTestSuite struct { - suite.Suite - - ctx sdk.Context - app *junoApp.App - queryClient types.QueryClient - msgServer types.MsgServer -} - -const ( - initialPower = int64(10000000000) -) - -func (s *IntegrationTestSuite) SetupTest() { - require := s.Require() - isCheckTx := false - junoApp := junoApp.Setup(s.T(), isCheckTx, 1) - - /* `Height: 9` because this check : - if (uint64(ctx.BlockHeight())/params.VotePeriod)-(aggregatePrevote.SubmitBlock/params.VotePeriod) != 1 { - return nil, types.ErrRevealPeriodMissMatch - } - */ - ctx := junoApp.BaseApp.NewContext(isCheckTx, tmproto.Header{ - ChainID: fmt.Sprintf("test-chain-%s", tmrand.Str(4)), - Height: 9, - }) - - queryHelper := baseapp.NewQueryServerTestHelper(ctx, junoApp.InterfaceRegistry()) - types.RegisterQueryServer(queryHelper, keeper.NewQuerier(junoApp.OracleKeeper)) - - sh := teststaking.NewHelper(s.T(), ctx, junoApp.StakingKeeper) - sh.Denom = bondDenom - amt := sdk.TokensFromConsensusPower(100, sdk.DefaultPowerReduction) - - // mint and send coins to validators - require.NoError(junoApp.BankKeeper.MintCoins(ctx, minttypes.ModuleName, initCoins)) - require.NoError(junoApp.BankKeeper.SendCoinsFromModuleToAccount(ctx, minttypes.ModuleName, addr, initCoins)) - require.NoError(junoApp.BankKeeper.MintCoins(ctx, minttypes.ModuleName, initCoins)) - require.NoError(junoApp.BankKeeper.SendCoinsFromModuleToAccount(ctx, minttypes.ModuleName, addr2, initCoins)) - - sh.CreateValidator(valAddr, valPubKey, amt, true) - sh.CreateValidator(valAddr2, valPubKey2, amt, true) - - staking.EndBlocker(ctx, junoApp.StakingKeeper) - - s.app = junoApp - s.ctx = ctx - s.queryClient = types.NewQueryClient(queryHelper) - s.msgServer = keeper.NewMsgServerImpl(junoApp.OracleKeeper) -} - -// Test addresses -var ( - valPubKeys = simapp.CreateTestPubKeys(2) - - valPubKey = valPubKeys[0] - pubKey = secp256k1.GenPrivKey().PubKey() - addr = sdk.AccAddress(pubKey.Address()) - valAddr = sdk.ValAddress(pubKey.Address()) - - valPubKey2 = valPubKeys[1] - pubKey2 = secp256k1.GenPrivKey().PubKey() - addr2 = sdk.AccAddress(pubKey2.Address()) - valAddr2 = sdk.ValAddress(pubKey2.Address()) - - initTokens = sdk.TokensFromConsensusPower(initialPower, sdk.DefaultPowerReduction) - initCoins = sdk.NewCoins(sdk.NewCoin(appparams.BondDenom, initTokens)) -) - -// NewTestMsgCreateValidator test msg creator -func NewTestMsgCreateValidator(address sdk.ValAddress, pubKey cryptotypes.PubKey, amt sdk.Int) *stakingtypes.MsgCreateValidator { - commission := stakingtypes.NewCommissionRates(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()) - msg, _ := stakingtypes.NewMsgCreateValidator( - address, pubKey, sdk.NewCoin(types.JunoDenom, amt), - stakingtypes.Description{}, commission, sdk.OneInt(), - ) - - return msg -} - -func (s *IntegrationTestSuite) TestSetFeederDelegation() { - app, ctx := s.app, s.ctx - - feederAddr := sdk.AccAddress([]byte("addr________________")) - feederAcc := app.AccountKeeper.NewAccountWithAddress(ctx, feederAddr) - app.AccountKeeper.SetAccount(ctx, feederAcc) - - err := s.app.OracleKeeper.ValidateFeeder(ctx, addr, valAddr) - s.Require().NoError(err) - err = s.app.OracleKeeper.ValidateFeeder(ctx, feederAddr, valAddr) - s.Require().Error(err) - - s.app.OracleKeeper.SetFeederDelegation(ctx, valAddr, feederAddr) - - err = s.app.OracleKeeper.ValidateFeeder(ctx, addr, valAddr) - s.Require().Error(err) - err = s.app.OracleKeeper.ValidateFeeder(ctx, feederAddr, valAddr) - s.Require().NoError(err) -} - -func (s *IntegrationTestSuite) TestGetFeederDelegation() { - app, ctx := s.app, s.ctx - - feederAddr := sdk.AccAddress([]byte("addr________________")) - feederAcc := app.AccountKeeper.NewAccountWithAddress(ctx, feederAddr) - app.AccountKeeper.SetAccount(ctx, feederAcc) - - s.app.OracleKeeper.SetFeederDelegation(ctx, valAddr, feederAddr) - resp, err := app.OracleKeeper.GetFeederDelegation(ctx, valAddr) - s.Require().NoError(err) - s.Require().Equal(resp, feederAddr) -} - -func (s *IntegrationTestSuite) TestMissCounter() { - app, ctx := s.app, s.ctx - missCounter := uint64(rand.Intn(100)) - - s.Require().Equal(app.OracleKeeper.GetMissCounter(ctx, valAddr), uint64(0)) - app.OracleKeeper.SetMissCounter(ctx, valAddr, missCounter) - s.Require().Equal(app.OracleKeeper.GetMissCounter(ctx, valAddr), missCounter) - - app.OracleKeeper.DeleteMissCounter(ctx, valAddr) - s.Require().Equal(app.OracleKeeper.GetMissCounter(ctx, valAddr), uint64(0)) -} - -func (s *IntegrationTestSuite) TestAggregateExchangeRatePrevote() { - app, ctx := s.app, s.ctx - - prevote := types.AggregateExchangeRatePrevote{ - Hash: "hash", - Voter: addr.String(), - SubmitBlock: 0, - } - app.OracleKeeper.SetAggregateExchangeRatePrevote(ctx, valAddr, prevote) - - _, err := app.OracleKeeper.GetAggregateExchangeRatePrevote(ctx, valAddr) - s.Require().NoError(err) - - app.OracleKeeper.DeleteAggregateExchangeRatePrevote(ctx, valAddr) - - _, err = app.OracleKeeper.GetAggregateExchangeRatePrevote(ctx, valAddr) - s.Require().Error(err) -} - -func (s *IntegrationTestSuite) TestAggregateExchangeRatePrevoteError() { - app, ctx := s.app, s.ctx - - _, err := app.OracleKeeper.GetAggregateExchangeRatePrevote(ctx, valAddr) - s.Require().Errorf(err, types.ErrNoAggregatePrevote.Error()) -} - -func (s *IntegrationTestSuite) TestAggregateExchangeRateVote() { - app, ctx := s.app, s.ctx - - var tuples types.ExchangeRateTuples - tuples = append(tuples, types.ExchangeRateTuple{ - Denom: displayDenom, - ExchangeRate: sdk.ZeroDec(), - }) - - vote := types.AggregateExchangeRateVote{ - ExchangeRateTuples: tuples, - Voter: addr.String(), - } - app.OracleKeeper.SetAggregateExchangeRateVote(ctx, valAddr, vote) - - _, err := app.OracleKeeper.GetAggregateExchangeRateVote(ctx, valAddr) - s.Require().NoError(err) - - app.OracleKeeper.DeleteAggregateExchangeRateVote(ctx, valAddr) - - _, err = app.OracleKeeper.GetAggregateExchangeRateVote(ctx, valAddr) - s.Require().Error(err) -} - -func (s *IntegrationTestSuite) TestAggregateExchangeRateVoteError() { - app, ctx := s.app, s.ctx - - _, err := app.OracleKeeper.GetAggregateExchangeRateVote(ctx, valAddr) - s.Require().Errorf(err, types.ErrNoAggregateVote.Error()) -} - -func (s *IntegrationTestSuite) TestSetExchangeRateWithEvent() { - app, ctx := s.app, s.ctx - err := app.OracleKeeper.SetExchangeRateWithEvent(ctx, displayDenom, sdk.OneDec()) - s.Require().NoError(err) - rate, err := app.OracleKeeper.GetExchangeRate(ctx, displayDenom) - s.Require().NoError(err) - s.Require().Equal(rate, sdk.OneDec()) -} - -func (s *IntegrationTestSuite) TestGetExchangeRate_InvalidDenom() { - app, ctx := s.app, s.ctx - - _, err := app.OracleKeeper.GetExchangeRate(ctx, "uxyz") - s.Require().Error(err) -} - -func (s *IntegrationTestSuite) TestGetExchangeRate_NotSet() { - app, ctx := s.app, s.ctx - - _, err := app.OracleKeeper.GetExchangeRate(ctx, displayDenom) - s.Require().Error(err) -} - -func (s *IntegrationTestSuite) TestGetExchangeRate_Valid() { - app, ctx := s.app, s.ctx - - app.OracleKeeper.SetExchangeRate(ctx, displayDenom, sdk.OneDec()) - rate, err := app.OracleKeeper.GetExchangeRate(ctx, displayDenom) - s.Require().NoError(err) - s.Require().Equal(rate, sdk.OneDec()) - - app.OracleKeeper.SetExchangeRate(ctx, strings.ToLower(displayDenom), sdk.OneDec()) - rate, err = app.OracleKeeper.GetExchangeRate(ctx, displayDenom) - s.Require().NoError(err) - s.Require().Equal(rate, sdk.OneDec()) -} - -func (s *IntegrationTestSuite) TestGetExchangeRateBase() { - oracleParams := s.app.OracleKeeper.GetParams(s.ctx) - - var exponent uint64 - for _, denom := range oracleParams.Whitelist { - if denom.BaseDenom == bondDenom { - exponent = uint64(denom.Exponent) - } - } - - power := sdk.MustNewDecFromStr("10").Power(exponent) - - s.app.OracleKeeper.SetExchangeRate(s.ctx, displayDenom, sdk.OneDec()) - rate, err := s.app.OracleKeeper.GetExchangeRateBase(s.ctx, bondDenom) - s.Require().NoError(err) - s.Require().Equal(rate.Mul(power), sdk.OneDec()) - - s.app.OracleKeeper.SetExchangeRate(s.ctx, strings.ToLower(displayDenom), sdk.OneDec()) - rate, err = s.app.OracleKeeper.GetExchangeRateBase(s.ctx, bondDenom) - s.Require().NoError(err) - s.Require().Equal(rate.Mul(power), sdk.OneDec()) -} - -func (s *IntegrationTestSuite) TestClearExchangeRate() { - app, ctx := s.app, s.ctx - - app.OracleKeeper.SetExchangeRate(ctx, displayDenom, sdk.OneDec()) - app.OracleKeeper.ClearExchangeRates(ctx) - _, err := app.OracleKeeper.GetExchangeRate(ctx, displayDenom) - s.Require().Error(err) -} - -func (s *IntegrationTestSuite) TestSetDenomPriceHistory() { - exchangeRate := sdk.NewDec(1000) - - for _, tc := range []struct { - desc string - symbolDenom string - exchangeRate sdk.Dec - blockHeight uint64 - shouldErr bool - }{ - { - desc: "Success case", - symbolDenom: types.JunoSymbol, - exchangeRate: exchangeRate, - blockHeight: 10, - shouldErr: false, - }, - { - desc: "Invalid block height", - symbolDenom: types.JunoSymbol, - exchangeRate: exchangeRate, - blockHeight: 0, - shouldErr: true, - }, - } { - tc := tc - s.Run(tc.desc, func() { - if !tc.shouldErr { - err := s.app.OracleKeeper.SetDenomPriceHistory(s.ctx, tc.symbolDenom, tc.exchangeRate, time.Now().UTC(), tc.blockHeight) - s.Require().NoError(err) - } else { - err := s.app.OracleKeeper.SetDenomPriceHistory(s.ctx, tc.symbolDenom, tc.exchangeRate, time.Now().UTC(), tc.blockHeight) - s.Require().Error(err) - } - }) - } -} - -func (s *IntegrationTestSuite) TestGetDenomPriceHistoryWithBlockHeight() { - params := s.app.OracleKeeper.GetParams(s.ctx) - - var blockHeight uint64 = 10 - votePeriodCount := blockHeight / params.VotePeriod - symbolDenom := types.JunoSymbol - time := time.Now().UTC() - err := s.app.OracleKeeper.SetDenomPriceHistory(s.ctx, symbolDenom, sdk.OneDec(), time, blockHeight) - s.Require().NoError(err) - price, err := s.app.OracleKeeper.GetDenomPriceHistoryWithBlockHeight(s.ctx, symbolDenom, 11) - s.Require().NoError(err) - s.Require().Equal(price.Price, sdk.OneDec()) - s.Require().Equal(price.PriceUpdateTime, time) - s.Require().Equal(price.VotePeriodCount, votePeriodCount) -} - -func (s *IntegrationTestSuite) TestIterateDenomPriceHistory() { - params := s.app.OracleKeeper.GetParams(s.ctx) - source := rand.NewSource(10) - r := rand.New(source) - symbolDenom := types.JunoSymbol - blockHeights := randUInt64Array(10, r) - - var votePeriodCounts []uint64 - for _, blockHeight := range blockHeights { - err := s.app.OracleKeeper.SetDenomPriceHistory(s.ctx, symbolDenom, sdk.OneDec(), time.Now().Add(time.Second*time.Duration(blockHeight)), blockHeight) - s.Require().NoError(err) - votePeriod := blockHeight / params.VotePeriod - votePeriodCounts = append(votePeriodCounts, votePeriod) - } - - var keys []uint64 - s.app.OracleKeeper.IterateDenomPriceHistory(s.ctx, symbolDenom, func(key uint64, priceHistoryEntry types.PriceHistoryEntry) bool { - keys = append(keys, key) - s.Require().Equal(priceHistoryEntry.Price, sdk.OneDec()) - return false - }) - - s.Require().Equal(len(votePeriodCounts), len(keys)) - for i, key := range keys { - s.Require().Equal(key, votePeriodCounts[i]) - } -} - -func (s *IntegrationTestSuite) TestDeleteDenomPriceHistory() { - params := s.app.OracleKeeper.GetParams(s.ctx) - - var blockHeight uint64 = 10 - votePeriodCount := blockHeight / params.VotePeriod - symbolDenom := types.JunoSymbol - time := time.Now().UTC() - err := s.app.OracleKeeper.SetDenomPriceHistory(s.ctx, symbolDenom, sdk.OneDec(), time, blockHeight) - s.Require().NoError(err) - price, err := s.app.OracleKeeper.GetDenomPriceHistoryWithBlockHeight(s.ctx, symbolDenom, 11) - s.Require().NoError(err) - s.Require().Equal(price.Price, sdk.OneDec()) - s.Require().Equal(price.PriceUpdateTime, time) - s.Require().Equal(price.VotePeriodCount, votePeriodCount) - - s.app.OracleKeeper.DeleteDenomPriceHistory(s.ctx, symbolDenom, votePeriodCount) - price, err = s.app.OracleKeeper.GetDenomPriceHistoryWithBlockHeight(s.ctx, symbolDenom, 11) - s.Require().Error(err) -} - -func randUInt64Array(number uint64, r *rand.Rand) []uint64 { - var result []uint64 - for number > 0 { - temp := r.Uint64() - result = append(result, temp) - number-- - } - - sort.Slice(result, func(i, j int) bool { return result[i] < result[j] }) - return result -} - -func TestKeeperTestSuite(t *testing.T) { - suite.Run(t, new(IntegrationTestSuite)) -} diff --git a/x/oracle/keeper/msg_server.go b/x/oracle/keeper/msg_server.go deleted file mode 100644 index f54422177..000000000 --- a/x/oracle/keeper/msg_server.go +++ /dev/null @@ -1,139 +0,0 @@ -package keeper - -import ( - "context" - - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - - "github.com/CosmosContracts/juno/v13/x/oracle/types" -) - -type msgServer struct { - Keeper -} - -// NewMsgServerImpl returns an implementation of the oracle MsgServer interface -// for the provided Keeper. -func NewMsgServerImpl(keeper Keeper) types.MsgServer { - return &msgServer{Keeper: keeper} -} - -func (ms msgServer) AggregateExchangeRatePrevote( - goCtx context.Context, - msg *types.MsgAggregateExchangeRatePrevote, -) (*types.MsgAggregateExchangeRatePrevoteResponse, error) { - ctx := sdk.UnwrapSDKContext(goCtx) - valAddr, err := sdk.ValAddressFromBech32(msg.Validator) - if err != nil { - return nil, err - } - feederAddr, err := sdk.AccAddressFromBech32(msg.Feeder) - if err != nil { - return nil, err - } - - if err := ms.ValidateFeeder(ctx, feederAddr, valAddr); err != nil { - return nil, err - } - - // Ensure prevote wasn't already submitted - if ms.HasAggregateExchangeRatePrevote(ctx, valAddr) { - return nil, types.ErrExistingPrevote - } - - // Convert hex string to votehash - voteHash, err := types.AggregateVoteHashFromHexString(msg.Hash) - if err != nil { - return nil, sdkerrors.Wrap(types.ErrInvalidHash, err.Error()) - } - - aggregatePrevote := types.NewAggregateExchangeRatePrevote(voteHash, valAddr, uint64(ctx.BlockHeight())) - ms.SetAggregateExchangeRatePrevote(ctx, valAddr, aggregatePrevote) - - return &types.MsgAggregateExchangeRatePrevoteResponse{}, nil -} - -func (ms msgServer) AggregateExchangeRateVote( - goCtx context.Context, - msg *types.MsgAggregateExchangeRateVote, -) (*types.MsgAggregateExchangeRateVoteResponse, error) { - ctx := sdk.UnwrapSDKContext(goCtx) - valAddr, err := sdk.ValAddressFromBech32(msg.Validator) - if err != nil { - return nil, err - } - feederAddr, err := sdk.AccAddressFromBech32(msg.Feeder) - if err != nil { - return nil, err - } - if err := ms.ValidateFeeder(ctx, feederAddr, valAddr); err != nil { - return nil, err - } - - params := ms.GetParams(ctx) - aggregatePrevote, err := ms.GetAggregateExchangeRatePrevote(ctx, valAddr) - if err != nil { - return nil, sdkerrors.Wrap(types.ErrNoAggregatePrevote, msg.Validator) - } - - // Check a msg is submitted proper period - if (uint64(ctx.BlockHeight())/params.VotePeriod)-(aggregatePrevote.SubmitBlock/params.VotePeriod) != 1 { - return nil, types.ErrRevealPeriodMissMatch - } - - exchangeRateTuples, err := types.ParseExchangeRateTuples(msg.ExchangeRates) - if err != nil { - return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidCoins, err.Error()) - } - - // Verify a exchange rate with aggregate prevote hash - hash := types.GetAggregateVoteHash(msg.Salt, msg.ExchangeRates, valAddr) - if aggregatePrevote.Hash != hash.String() { - return nil, sdkerrors.Wrapf(types.ErrVerificationFailed, "must be given %s not %s", aggregatePrevote.Hash, hash) - } - - // Filter out rates which aren't included in the Whitelist - filteredTuples := types.ExchangeRateTuples{} - for _, tuple := range exchangeRateTuples { - if params.Whitelist.Contains(tuple.Denom) { - filteredTuples = append(filteredTuples, tuple) - } - } - - // Move aggregate prevote to aggregate vote with given exchange rates - ms.SetAggregateExchangeRateVote(ctx, valAddr, types.NewAggregateExchangeRateVote(filteredTuples, valAddr)) - ms.DeleteAggregateExchangeRatePrevote(ctx, valAddr) - - return &types.MsgAggregateExchangeRateVoteResponse{}, nil -} - -func (ms msgServer) DelegateFeedConsent( - goCtx context.Context, - msg *types.MsgDelegateFeedConsent, -) (*types.MsgDelegateFeedConsentResponse, error) { - ctx := sdk.UnwrapSDKContext(goCtx) - - operatorAddr, err := sdk.ValAddressFromBech32(msg.Operator) - if err != nil { - return nil, err - } - - delegateAddr, err := sdk.AccAddressFromBech32(msg.Delegate) - if err != nil { - return nil, err - } - - val := ms.StakingKeeper.Validator(ctx, operatorAddr) - if val == nil { - return nil, sdkerrors.Wrap(stakingtypes.ErrNoValidatorFound, msg.Operator) - } - - ms.SetFeederDelegation(ctx, operatorAddr, delegateAddr) - err = ctx.EventManager().EmitTypedEvent(&types.EventDelegateFeedConsent{ - Operator: msg.Operator, Delegate: msg.Delegate, - }) - - return &types.MsgDelegateFeedConsentResponse{}, err -} diff --git a/x/oracle/keeper/msg_server_test.go b/x/oracle/keeper/msg_server_test.go deleted file mode 100644 index 61e4b0827..000000000 --- a/x/oracle/keeper/msg_server_test.go +++ /dev/null @@ -1,155 +0,0 @@ -package keeper_test - -import ( - "crypto/rand" - "encoding/hex" - "fmt" - "strings" - - "github.com/CosmosContracts/juno/v13/x/oracle/types" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" -) - -// GenerateSalt generates a random salt, size length/2, as a HEX encoded string. -func GenerateSalt(length int) (string, error) { - if length == 0 { - return "", fmt.Errorf("failed to generate salt: zero length") - } - - bytes := make([]byte, length) - - if _, err := rand.Read(bytes); err != nil { - return "", err - } - - return hex.EncodeToString(bytes), nil -} - -func (s *IntegrationTestSuite) TestMsgServer_AggregateExchangeRatePrevote() { - ctx := s.ctx - - exchangeRatesStr := "123.2:ujuno" - salt, err := GenerateSalt(32) - s.Require().NoError(err) - hash := types.GetAggregateVoteHash(salt, exchangeRatesStr, valAddr) - - invalidHash := &types.MsgAggregateExchangeRatePrevote{ - Hash: "invalid_hash", - Feeder: addr.String(), - Validator: valAddr.String(), - } - invalidFeeder := &types.MsgAggregateExchangeRatePrevote{ - Hash: hash.String(), - Feeder: "invalid_feeder", - Validator: valAddr.String(), - } - invalidValidator := &types.MsgAggregateExchangeRatePrevote{ - Hash: hash.String(), - Feeder: addr.String(), - Validator: "invalid_val", - } - validMsg := &types.MsgAggregateExchangeRatePrevote{ - Hash: hash.String(), - Feeder: addr.String(), - Validator: valAddr.String(), - } - - _, err = s.msgServer.AggregateExchangeRatePrevote(sdk.WrapSDKContext(ctx), invalidHash) - s.Require().Error(err) - _, err = s.msgServer.AggregateExchangeRatePrevote(sdk.WrapSDKContext(ctx), invalidFeeder) - s.Require().Error(err) - _, err = s.msgServer.AggregateExchangeRatePrevote(sdk.WrapSDKContext(ctx), invalidValidator) - s.Require().Error(err) - _, err = s.msgServer.AggregateExchangeRatePrevote(sdk.WrapSDKContext(ctx), validMsg) - s.Require().NoError(err) -} - -func (s *IntegrationTestSuite) TestMsgServer_AggregateExchangeRateVote() { - ctx := s.ctx - - ratesStr := "ujuno:123.2" - ratesStrInvalidCoin := "ujuno:123.2,badcoin:234.5" - salt, err := GenerateSalt(32) - s.Require().NoError(err) - hash := types.GetAggregateVoteHash(salt, ratesStr, valAddr) - hashInvalidRate := types.GetAggregateVoteHash(salt, ratesStrInvalidCoin, valAddr) - - prevoteMsg := &types.MsgAggregateExchangeRatePrevote{ - Hash: hash.String(), - Feeder: addr.String(), - Validator: valAddr.String(), - } - voteMsg := &types.MsgAggregateExchangeRateVote{ - Feeder: addr.String(), - Validator: valAddr.String(), - Salt: salt, - ExchangeRates: ratesStr, - } - voteMsgInvalidRate := &types.MsgAggregateExchangeRateVote{ - Feeder: addr.String(), - Validator: valAddr.String(), - Salt: salt, - ExchangeRates: ratesStrInvalidCoin, - } - - // Flattened Whitelist symbols to make checks easier - Whitelist := s.app.OracleKeeper.GetParams(ctx).Whitelist - var WhitelistFlat []string - for _, v := range Whitelist { - WhitelistFlat = append(WhitelistFlat, v.SymbolDenom) - } - - // No existing prevote - _, err = s.msgServer.AggregateExchangeRateVote(sdk.WrapSDKContext(ctx), voteMsg) - s.Require().EqualError(err, sdkerrors.Wrap(types.ErrNoAggregatePrevote, valAddr.String()).Error()) - _, err = s.msgServer.AggregateExchangeRatePrevote(sdk.WrapSDKContext(ctx), prevoteMsg) - s.Require().NoError(err) - // Reveal period mismatch - _, err = s.msgServer.AggregateExchangeRateVote(sdk.WrapSDKContext(ctx), voteMsg) - s.Require().EqualError(err, types.ErrRevealPeriodMissMatch.Error()) - - // Valid - s.app.OracleKeeper.SetAggregateExchangeRatePrevote( - ctx, - valAddr, - types.NewAggregateExchangeRatePrevote( - hash, valAddr, 1, - )) - _, err = s.msgServer.AggregateExchangeRateVote(sdk.WrapSDKContext(ctx), voteMsg) - s.Require().NoError(err) - vote, err := s.app.OracleKeeper.GetAggregateExchangeRateVote(ctx, valAddr) - s.Require().Nil(err) - for _, v := range vote.ExchangeRateTuples { - s.Require().Contains(WhitelistFlat, strings.ToLower(v.Denom)) - } - - // Valid, but with an exchange rate which isn't in Whitelist - s.app.OracleKeeper.SetAggregateExchangeRatePrevote( - ctx, - valAddr, - types.NewAggregateExchangeRatePrevote( - hashInvalidRate, valAddr, 1, - )) - _, err = s.msgServer.AggregateExchangeRateVote(sdk.WrapSDKContext(ctx), voteMsgInvalidRate) - s.Require().NoError(err) - vote, err = s.app.OracleKeeper.GetAggregateExchangeRateVote(ctx, valAddr) - s.Require().NoError(err) - for _, v := range vote.ExchangeRateTuples { - s.Require().Contains(WhitelistFlat, strings.ToLower(v.Denom)) - } -} - -func (s *IntegrationTestSuite) TestMsgServer_DelegateFeedConsent() { - app, ctx := s.app, s.ctx - - feederAddr := sdk.AccAddress([]byte("addr________________")) - feederAcc := app.AccountKeeper.NewAccountWithAddress(ctx, feederAddr) - app.AccountKeeper.SetAccount(ctx, feederAcc) - - _, err := s.msgServer.DelegateFeedConsent(sdk.WrapSDKContext(ctx), &types.MsgDelegateFeedConsent{ - Operator: valAddr.String(), - Delegate: feederAddr.String(), - }) - s.Require().NoError(err) -} diff --git a/x/oracle/keeper/params.go b/x/oracle/keeper/params.go deleted file mode 100644 index 01c5406ba..000000000 --- a/x/oracle/keeper/params.go +++ /dev/null @@ -1,75 +0,0 @@ -package keeper - -import ( - "github.com/CosmosContracts/juno/v13/x/oracle/types" - - sdk "github.com/cosmos/cosmos-sdk/types" -) - -// VotePeriod returns the number of blocks during which voting takes place. -func (k Keeper) VotePeriod(ctx sdk.Context) (res uint64) { - k.paramSpace.Get(ctx, types.KeyVotePeriod, &res) - return -} - -// VoteThreshold returns the minimum percentage of votes that must be received -// for a ballot to pass. -func (k Keeper) VoteThreshold(ctx sdk.Context) (res sdk.Dec) { - k.paramSpace.Get(ctx, types.KeyVoteThreshold, &res) - return -} - -// RewardBand returns the ratio of allowable exchange rate error that a validator -// can be rewarded. -func (k Keeper) RewardBand(ctx sdk.Context) (res sdk.Dec) { - k.paramSpace.Get(ctx, types.KeyRewardBand, &res) - return -} - -// RewardDistributionWindow returns the number of vote periods during which -// seigniorage reward comes in and then is distributed. -func (k Keeper) RewardDistributionWindow(ctx sdk.Context) (res uint64) { - k.paramSpace.Get(ctx, types.KeyRewardDistributionWindow, &res) - return -} - -// Whitelist returns the denom list that can be activated -func (k Keeper) Whitelist(ctx sdk.Context) (res types.DenomList) { - k.paramSpace.Get(ctx, types.KeyWhitelist, &res) - return -} - -// SetWhitelist updates the accepted list of assets supported by the x/oracle -// module. -func (k Keeper) SetWhitelist(ctx sdk.Context, whitelist types.DenomList) { - k.paramSpace.Set(ctx, types.KeyWhitelist, whitelist) -} - -// SlashFraction returns oracle voting penalty rate -func (k Keeper) SlashFraction(ctx sdk.Context) (res sdk.Dec) { - k.paramSpace.Get(ctx, types.KeySlashFraction, &res) - return -} - -// SlashWindow returns # of vote period for oracle slashing -func (k Keeper) SlashWindow(ctx sdk.Context) (res uint64) { - k.paramSpace.Get(ctx, types.KeySlashWindow, &res) - return -} - -// MinValidPerWindow returns oracle slashing threshold -func (k Keeper) MinValidPerWindow(ctx sdk.Context) (res sdk.Dec) { - k.paramSpace.Get(ctx, types.KeyMinValidPerWindow, &res) - return -} - -// GetParams returns the total set of oracle parameters. -func (k Keeper) GetParams(ctx sdk.Context) (params types.Params) { - k.paramSpace.GetParamSet(ctx, ¶ms) - return params -} - -// SetParams sets the total set of oracle parameters. -func (k Keeper) SetParams(ctx sdk.Context, params types.Params) { - k.paramSpace.SetParamSet(ctx, ¶ms) -} diff --git a/x/oracle/keeper/params_test.go b/x/oracle/keeper/params_test.go deleted file mode 100644 index 358cb0f06..000000000 --- a/x/oracle/keeper/params_test.go +++ /dev/null @@ -1,21 +0,0 @@ -package keeper_test - -import ( - "github.com/CosmosContracts/juno/v13/x/oracle/types" - sdk "github.com/cosmos/cosmos-sdk/types" -) - -func (s *IntegrationTestSuite) TestVoteThreshold() { - app, ctx := s.app, s.ctx - - voteDec := app.OracleKeeper.VoteThreshold(ctx) - s.Require().Equal(sdk.MustNewDecFromStr("0.5"), voteDec) - - newVoteTreshold := sdk.MustNewDecFromStr("0.6") - defaultParams := types.DefaultParams() - defaultParams.VoteThreshold = newVoteTreshold - app.OracleKeeper.SetParams(ctx, defaultParams) - - voteThresholdDec := app.OracleKeeper.VoteThreshold(ctx) - s.Require().Equal(newVoteTreshold, voteThresholdDec) -} diff --git a/x/oracle/keeper/proposal_handler.go b/x/oracle/keeper/proposal_handler.go deleted file mode 100644 index 522bfdf33..000000000 --- a/x/oracle/keeper/proposal_handler.go +++ /dev/null @@ -1,166 +0,0 @@ -package keeper - -import ( - "strings" - - "github.com/CosmosContracts/juno/v13/x/oracle/types" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" -) - -func NewOracleProposalHandler(k Keeper) govtypes.Handler { - return func(ctx sdk.Context, content govtypes.Content) error { - if content == nil { - return sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, "content must not be empty") - } - - switch c := content.(type) { - case *types.AddTrackingPriceHistoryProposal: - return handleAddTrackingPriceHistoryProposal(ctx, k, *c) - case *types.AddTrackingPriceHistoryWithWhitelistProposal: - return handleAddTrackingPriceHistoryWithWhitelistProposal(ctx, k, *c) - case *types.RemoveTrackingPriceHistoryProposal: - return handleRemoveTrackingPriceHistoryProposal(ctx, k, *c) - default: - return sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "unrecognized wasm proposal content type: %T", c) - } - } -} - -func handleAddTrackingPriceHistoryProposal(ctx sdk.Context, k Keeper, p types.AddTrackingPriceHistoryProposal) error { - // Validate - if err := p.ValidateBasic(); err != nil { - return err - } - - for i := range p.TrackingList { - p.TrackingList[i].SymbolDenom = strings.ToUpper(p.TrackingList[i].SymbolDenom) - } - // Get params - params := k.GetParams(ctx) - // Check if not in accept list - currentWhitelist := params.Whitelist - _, _, isSubset := isSubSet(currentWhitelist, p.TrackingList) - if !isSubset { - return sdkerrors.Wrap(types.ErrUnknownDenom, "Denom not in accept list") - } - // Check if not in tracking list then add to tracking list - currentTrackingList := params.TwapTrackingList - unSubList, _, isSubset := isSubSet(currentTrackingList, p.TrackingList) - if !isSubset { - currentTrackingList = append(currentTrackingList, unSubList...) - } - - // Set params - params.TwapTrackingList = currentTrackingList - k.SetParams(ctx, params) - - return nil -} - -func handleAddTrackingPriceHistoryWithWhitelistProposal(ctx sdk.Context, k Keeper, p types.AddTrackingPriceHistoryWithWhitelistProposal) error { - // Validate - if err := p.ValidateBasic(); err != nil { - return err - } - - for i := range p.TrackingList { - p.TrackingList[i].SymbolDenom = strings.ToUpper(p.TrackingList[i].SymbolDenom) - } - // Get params - params := k.GetParams(ctx) - // Check if not in accept list then add to accept list - currentWhitelist := params.Whitelist - unSubList, _, isSubset := isSubSet(currentWhitelist, p.TrackingList) - if !isSubset { - currentWhitelist = append(currentWhitelist, unSubList...) - } - // Check if not in tracking list then add to tracking list - currentTrackingList := params.TwapTrackingList - unSubList, _, isSubset = isSubSet(currentTrackingList, p.TrackingList) - if !isSubset { - currentTrackingList = append(currentTrackingList, unSubList...) - } - - // Set params - params.Whitelist = currentWhitelist - params.TwapTrackingList = currentTrackingList - k.SetParams(ctx, params) - - return nil -} - -func handleRemoveTrackingPriceHistoryProposal(ctx sdk.Context, k Keeper, p types.RemoveTrackingPriceHistoryProposal) error { - // Validate - if err := p.ValidateBasic(); err != nil { - return err - } - for i := range p.RemoveTwapList { - p.RemoveTwapList[i].SymbolDenom = strings.ToUpper(p.RemoveTwapList[i].SymbolDenom) - } - // Get params - params := k.GetParams(ctx) - // Check if denom in tracking list then remove from tracking list - currentTrackingList := params.TwapTrackingList - _, subList, _ := isSubSet(currentTrackingList, p.RemoveTwapList) - if len(subList) > 0 { - // remove from tracking list and price tracking store - for _, denom := range subList { - // remove tracking list - currentTrackingList = removeDenomFromList(currentTrackingList, denom) - // remove store - var keys []uint64 - k.IterateDenomPriceHistory(ctx, denom.SymbolDenom, func(key uint64, _ types.PriceHistoryEntry) bool { - keys = append(keys, key) - return false - }) - for _, key := range keys { - k.DeleteDenomPriceHistory(ctx, denom.SymbolDenom, key) - } - } - } - // Set params - params.TwapTrackingList = currentTrackingList - k.SetParams(ctx, params) - - return nil -} - -func isSubSet(super, sub types.DenomList) (unSubList types.DenomList, subList types.DenomList, isSubSet bool) { - if len(sub) == 0 { - return unSubList, subList, true - } - - var matches int - for _, o := range sub { - var isEqual bool - for _, s := range super { - s := s - if o.Equal(&s) { - matches++ - isEqual = true - break - } - } - if isEqual { - subList = append(subList, o) - } else { - unSubList = append(unSubList, o) - } - } - - return unSubList, subList, matches == len(sub) -} - -func removeDenomFromList(denomList types.DenomList, removeDenom types.Denom) types.DenomList { - var newDenomList types.DenomList - - for _, denom := range denomList { - if !denom.Equal(&removeDenom) { - newDenomList = append(newDenomList, denom) - } - } - - return newDenomList -} diff --git a/x/oracle/keeper/proposal_integration_test.go b/x/oracle/keeper/proposal_integration_test.go deleted file mode 100644 index 93da7329b..000000000 --- a/x/oracle/keeper/proposal_integration_test.go +++ /dev/null @@ -1,125 +0,0 @@ -package keeper - -import ( - "testing" - - "github.com/CosmosContracts/juno/v13/x/oracle/types" - "github.com/stretchr/testify/require" -) - -func TestAddTrackingPriceHistoryProposal(t *testing.T) { - ctx, keepers := CreateTestInput(t, false) - govKeeper, oracleKeeper := keepers.GovKeeper, keepers.OracleKeeper - - var TwapTrackingList types.DenomList - params := types.DefaultParams() - params.TwapTrackingList = TwapTrackingList - oracleKeeper.SetParams(ctx, params) - - params = oracleKeeper.GetParams(ctx) - require.Equal(t, 0, len(params.TwapTrackingList)) - - trackingList := types.DenomList{ - { - BaseDenom: types.JunoDenom, - SymbolDenom: types.JunoSymbol, - Exponent: types.JunoExponent, - }, // Already in Whitelist (Default params) - } - - src := types.AddTrackingPriceHistoryProposalFixture(func(p *types.AddTrackingPriceHistoryProposal) { - p.TrackingList = trackingList - }) - - // submit proposal - submitedProposal, err := govKeeper.SubmitProposal(ctx, src) - require.NoError(t, err) - // execute proposal - handler := govKeeper.Router().GetRoute(submitedProposal.ProposalRoute()) - err = handler(ctx, submitedProposal.GetContent()) - require.NoError(t, err) - - params = oracleKeeper.GetParams(ctx) - require.Equal(t, 1, len(params.TwapTrackingList)) - require.Equal(t, params.TwapTrackingList, trackingList) -} - -func TestAddTrackingPriceHistoryWithWhitelistProposal(t *testing.T) { - ctx, keepers := CreateTestInput(t, false) - govKeeper, oracleKeeper := keepers.GovKeeper, keepers.OracleKeeper - - var emptyDenomList types.DenomList - params := types.DefaultParams() - params.Whitelist = emptyDenomList - params.TwapTrackingList = emptyDenomList - oracleKeeper.SetParams(ctx, params) - - params = oracleKeeper.GetParams(ctx) - require.Equal(t, 0, len(params.Whitelist)) - require.Equal(t, 0, len(params.TwapTrackingList)) - - trackingList := types.DenomList{ - { - BaseDenom: types.JunoDenom, - SymbolDenom: types.JunoSymbol, - Exponent: types.JunoExponent, - }, - { - BaseDenom: types.AtomDenom, - SymbolDenom: types.AtomSymbol, - Exponent: types.AtomExponent, - }, - } - - src := types.AddTrackingPriceHistoryWithWhitelistProposalFixture(func(p *types.AddTrackingPriceHistoryWithWhitelistProposal) { - p.TrackingList = trackingList - }) - - submittedProposal, err := govKeeper.SubmitProposal(ctx, src) - require.NoError(t, err) - - // execute proposal - handler := govKeeper.Router().GetRoute(submittedProposal.ProposalRoute()) - err = handler(ctx, submittedProposal.GetContent()) - require.NoError(t, err) - - params = oracleKeeper.GetParams(ctx) - require.Equal(t, params.Whitelist, trackingList) - require.Equal(t, params.TwapTrackingList, trackingList) -} - -func TestRemoveTrackingPriceHistoryProposal(t *testing.T) { - ctx, keepers := CreateTestInput(t, false) - govKeeper, oracleKeeper := keepers.GovKeeper, keepers.OracleKeeper - - params := oracleKeeper.GetParams(ctx) - require.Equal(t, 2, len(params.Whitelist)) - require.Equal(t, 2, len(params.TwapTrackingList)) - - trackingList := types.DenomList{ - { - BaseDenom: types.JunoDenom, - SymbolDenom: types.JunoSymbol, - Exponent: types.JunoExponent, - }, - { - BaseDenom: types.AtomDenom, - SymbolDenom: types.AtomSymbol, - Exponent: types.AtomExponent, - }, - } - - src := types.RemoveTrackingPriceHistoryProposalFixture(func(p *types.RemoveTrackingPriceHistoryProposal) { - p.RemoveTwapList = types.DenomList{trackingList[0]} - }) - - submittedProposal, err := govKeeper.SubmitProposal(ctx, src) - require.NoError(t, err) - handler := govKeeper.Router().GetRoute(submittedProposal.ProposalRoute()) - err = handler(ctx, submittedProposal.GetContent()) - require.NoError(t, err) - - params = oracleKeeper.GetParams(ctx) - require.Equal(t, params.Whitelist, trackingList) - require.Equal(t, params.TwapTrackingList, types.DenomList{trackingList[1]}) -} diff --git a/x/oracle/keeper/reward.go b/x/oracle/keeper/reward.go deleted file mode 100644 index 8bba23a0d..000000000 --- a/x/oracle/keeper/reward.go +++ /dev/null @@ -1,86 +0,0 @@ -package keeper - -import ( - "fmt" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/CosmosContracts/juno/v13/x/oracle/types" - "github.com/CosmosContracts/juno/v13/x/oracle/util" -) - -// prependJunoIfUnique pushs `ujuno` denom to the front of the list, if it is not yet included. -func prependJunoIfUnique(voteTargets []string) []string { - if util.Contains(types.JunoDenom, voteTargets) { - return voteTargets - } - rewardDenoms := make([]string, len(voteTargets)+1) - rewardDenoms[0] = types.JunoDenom - copy(rewardDenoms[1:], voteTargets) - return rewardDenoms -} - -// RewardBallotWinners is executed at the end of every voting period, where we -// give out a portion of seigniorage reward(reward-weight) to the oracle voters -// that voted correctly. -func (k Keeper) RewardBallotWinners( - ctx sdk.Context, - votePeriod int64, - rewardDistributionWindow int64, - voteTargets []string, - ballotWinners []types.Claim, -) { - // sum weight of the claims - var ballotPowerSum int64 - for _, winner := range ballotWinners { - ballotPowerSum += winner.Weight - } - - // return if the ballot is empty - if ballotPowerSum == 0 { - return - } - - distributionRatio := sdk.NewDec(votePeriod).QuoInt64(rewardDistributionWindow) - var periodRewards sdk.DecCoins - rewardDenoms := prependJunoIfUnique(voteTargets) - for _, denom := range rewardDenoms { - rewardPool := k.GetRewardPool(ctx, denom) - - // return if there's no rewards to give out - if rewardPool.IsZero() { - continue - } - - periodRewards = periodRewards.Add(sdk.NewDecCoinFromDec( - denom, - sdk.NewDecFromInt(rewardPool.Amount).Mul(distributionRatio), - )) - } - - // distribute rewards - var distributedReward sdk.Coins - - for _, winner := range ballotWinners { - receiverVal := k.StakingKeeper.Validator(ctx, winner.Recipient) - // in case absence of the validator, we just skip distribution - if receiverVal == nil { - continue - } - - // reflects contribution - rewardCoins, _ := periodRewards.MulDec(sdk.NewDec(winner.Weight).QuoInt64(ballotPowerSum)).TruncateDecimal() - if rewardCoins.IsZero() { - continue - } - - k.distrKeeper.AllocateTokensToValidator(ctx, receiverVal, sdk.NewDecCoinsFromCoins(rewardCoins...)) - distributedReward = distributedReward.Add(rewardCoins...) - } - - // move distributed reward to distribution module - err := k.bankKeeper.SendCoinsFromModuleToModule(ctx, types.ModuleName, k.distrName, distributedReward) - if err != nil { - panic(fmt.Errorf("failed to send coins to distribution module %w", err)) - } -} diff --git a/x/oracle/keeper/reward_test.go b/x/oracle/keeper/reward_test.go deleted file mode 100644 index 7975befaa..000000000 --- a/x/oracle/keeper/reward_test.go +++ /dev/null @@ -1,45 +0,0 @@ -package keeper_test - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/CosmosContracts/juno/v13/x/oracle/types" -) - -// Test the reward giving mechanism -func (s *IntegrationTestSuite) TestRewardBallotWinners() { - // Add claim pools - claims := []types.Claim{ - types.NewClaim(10, 10, 0, valAddr), - types.NewClaim(20, 20, 0, valAddr2), - } - - // Prepare reward pool - givingAmt := sdk.NewCoins(sdk.NewInt64Coin(types.JunoDenom, 30000000)) - err := s.app.BankKeeper.MintCoins(s.ctx, "mint", givingAmt) - s.Require().NoError(err) - err = s.app.BankKeeper.SendCoinsFromModuleToModule(s.ctx, "mint", "oracle", givingAmt) - s.Require().NoError(err) - - var voteTargets []string - params := s.app.OracleKeeper.GetParams(s.ctx) - for _, v := range params.Whitelist { - voteTargets = append(voteTargets, v.SymbolDenom) - } - - votePeriodsPerWindow := sdk.NewDec((int64)(s.app.OracleKeeper.RewardDistributionWindow(s.ctx))). - QuoInt64((int64)(s.app.OracleKeeper.VotePeriod(s.ctx))). - TruncateInt64() - s.app.OracleKeeper.RewardBallotWinners(s.ctx, (int64)(s.app.OracleKeeper.VotePeriod(s.ctx)), (int64)(s.app.OracleKeeper.RewardDistributionWindow(s.ctx)), voteTargets, claims) - outstandingRewardsDec := s.app.DistrKeeper.GetValidatorOutstandingRewardsCoins(s.ctx, valAddr) - outstandingRewards, _ := outstandingRewardsDec.TruncateDecimal() - s.Require().Equal(sdk.NewDecFromInt(givingAmt.AmountOf(types.JunoDenom)).QuoInt64(votePeriodsPerWindow).QuoInt64(3).TruncateInt(), - outstandingRewards.AmountOf(types.JunoDenom)) -} - -func (s *IntegrationTestSuite) TestRewardBallotWinnersZeroPower() { - zeroClaim := types.NewClaim(0, 0, 0, valAddr) - s.app.OracleKeeper.RewardBallotWinners(s.ctx, 0, 0, []string{}, []types.Claim{zeroClaim}) - outstandingRewardsDec := s.app.DistrKeeper.GetValidatorOutstandingRewardsCoins(s.ctx, valAddr) - s.Require().Equal("", outstandingRewardsDec.String()) -} diff --git a/x/oracle/keeper/reward_unit_test.go b/x/oracle/keeper/reward_unit_test.go deleted file mode 100644 index b7649b771..000000000 --- a/x/oracle/keeper/reward_unit_test.go +++ /dev/null @@ -1,24 +0,0 @@ -package keeper - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestPrependJunoIfUnique(t *testing.T) { - require := require.New(t) - tcs := []struct { - in []string - out []string - }{ - // Should prepend "ujuno" to a slice of denoms, unless it is already present. - {[]string{}, []string{"ujuno"}}, - {[]string{"a"}, []string{"ujuno", "a"}}, - {[]string{"x", "a", "heeeyyy"}, []string{"ujuno", "x", "a", "heeeyyy"}}, - {[]string{"x", "a", "ujuno"}, []string{"x", "a", "ujuno"}}, - } - for i, tc := range tcs { - require.Equal(tc.out, prependJunoIfUnique(tc.in), i) - } -} diff --git a/x/oracle/keeper/slash.go b/x/oracle/keeper/slash.go deleted file mode 100644 index 13aa3b9d8..000000000 --- a/x/oracle/keeper/slash.go +++ /dev/null @@ -1,57 +0,0 @@ -package keeper - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" -) - -// SlashAndResetMissCounters iterates over all the current missed counters and -// calculates the "valid vote rate" as: -// (votePeriodsPerWindow - missCounter)/votePeriodsPerWindow. -// -// If the valid vote rate is below the minValidPerWindow, the validator will be -// slashed and jailed. -func (k Keeper) SlashAndResetMissCounters(ctx sdk.Context) { - height := ctx.BlockHeight() - distributionHeight := height - sdk.ValidatorUpdateDelay - 1 - - var ( - slashWindow = int64(k.SlashWindow(ctx)) - votePeriod = int64(k.VotePeriod(ctx)) - votePeriodsPerWindow = sdk.NewDec(slashWindow).QuoInt64(votePeriod).TruncateInt64() - ) - - var ( - minValidPerWindow = k.MinValidPerWindow(ctx) - slashFraction = k.SlashFraction(ctx) - powerReduction = k.StakingKeeper.PowerReduction(ctx) - ) - - k.IterateMissCounters(ctx, func(operator sdk.ValAddress, missCounter uint64) bool { - diff := sdk.NewInt(votePeriodsPerWindow - int64(missCounter)) - validVoteRate := sdk.NewDecFromInt(diff).QuoInt64(votePeriodsPerWindow) - - // Slash and jail the validator if their valid vote rate is smaller than the - // minimum threshold. - if validVoteRate.LT(minValidPerWindow) { - validator := k.StakingKeeper.Validator(ctx, operator) - if validator.IsBonded() && !validator.IsJailed() { - consAddr, err := validator.GetConsAddr() - if err != nil { - panic(err) - } - - k.StakingKeeper.Slash( - ctx, - consAddr, - distributionHeight, - validator.GetConsensusPower(powerReduction), slashFraction, - ) - - k.StakingKeeper.Jail(ctx, consAddr) - } - } - - k.DeleteMissCounter(ctx, operator) - return false - }) -} diff --git a/x/oracle/keeper/slash_test.go b/x/oracle/keeper/slash_test.go deleted file mode 100644 index 67c0ac3e2..000000000 --- a/x/oracle/keeper/slash_test.go +++ /dev/null @@ -1,59 +0,0 @@ -package keeper_test - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/staking" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" -) - -func (s *IntegrationTestSuite) TestSlashAndResetMissCounters() { - // initial setup - addr, addr2 := valAddr, valAddr2 - amt := sdk.TokensFromConsensusPower(100, sdk.DefaultPowerReduction) - - s.Require().Equal(amt, s.app.StakingKeeper.Validator(s.ctx, addr).GetBondedTokens()) - s.Require().Equal(amt, s.app.StakingKeeper.Validator(s.ctx, addr2).GetBondedTokens()) - - votePeriodsPerWindow := sdk.NewDec(int64(s.app.OracleKeeper.SlashWindow(s.ctx))).QuoInt64(int64(s.app.OracleKeeper.VotePeriod(s.ctx))).TruncateInt64() - slashFraction := s.app.OracleKeeper.SlashFraction(s.ctx) - minValidVotes := s.app.OracleKeeper.MinValidPerWindow(s.ctx).MulInt64(votePeriodsPerWindow).TruncateInt64() - // Case 1, no slash - s.app.OracleKeeper.SetMissCounter(s.ctx, valAddr, uint64(votePeriodsPerWindow-minValidVotes)) - s.app.OracleKeeper.SlashAndResetMissCounters(s.ctx) - staking.EndBlocker(s.ctx, s.app.StakingKeeper) - - validator, _ := s.app.StakingKeeper.GetValidator(s.ctx, valAddr) - s.Require().Equal(amt, validator.GetBondedTokens()) - - // Case 2, slash - s.app.OracleKeeper.SetMissCounter(s.ctx, valAddr, uint64(votePeriodsPerWindow-minValidVotes+1)) - s.app.OracleKeeper.SlashAndResetMissCounters(s.ctx) - validator, _ = s.app.StakingKeeper.GetValidator(s.ctx, valAddr) - s.Require().Equal(amt.Sub(slashFraction.MulInt(amt).TruncateInt()), validator.GetBondedTokens()) - s.Require().True(validator.Jailed) - - // Case 3, slash unbonded validator - validator, _ = s.app.StakingKeeper.GetValidator(s.ctx, valAddr) - validator.Status = stakingtypes.Unbonded - validator.Jailed = false - validator.Tokens = amt - s.app.StakingKeeper.SetValidator(s.ctx, validator) - - s.app.OracleKeeper.SetMissCounter(s.ctx, valAddr, uint64(votePeriodsPerWindow-minValidVotes+1)) - s.app.OracleKeeper.SlashAndResetMissCounters(s.ctx) - validator, _ = s.app.StakingKeeper.GetValidator(s.ctx, valAddr) - s.Require().Equal(amt, validator.Tokens) - s.Require().False(validator.Jailed) - - // Case 4, slash jailed validator - validator, _ = s.app.StakingKeeper.GetValidator(s.ctx, valAddr) - validator.Status = stakingtypes.Bonded - validator.Jailed = true - validator.Tokens = amt - s.app.StakingKeeper.SetValidator(s.ctx, validator) - - s.app.OracleKeeper.SetMissCounter(s.ctx, valAddr, uint64(votePeriodsPerWindow-minValidVotes+1)) - s.app.OracleKeeper.SlashAndResetMissCounters(s.ctx) - validator, _ = s.app.StakingKeeper.GetValidator(s.ctx, valAddr) - s.Require().Equal(amt, validator.Tokens) -} diff --git a/x/oracle/keeper/test_common.go b/x/oracle/keeper/test_common.go deleted file mode 100644 index 365ebf4b6..000000000 --- a/x/oracle/keeper/test_common.go +++ /dev/null @@ -1,442 +0,0 @@ -package keeper - -import ( - "encoding/binary" - "fmt" - "testing" - "time" - - "github.com/cosmos/cosmos-sdk/baseapp" - "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/std" - "github.com/cosmos/cosmos-sdk/store" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/cosmos/cosmos-sdk/types/module" - "github.com/cosmos/cosmos-sdk/x/auth" - authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/cosmos/cosmos-sdk/x/auth/vesting" - authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" - "github.com/cosmos/cosmos-sdk/x/bank" - bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/cosmos/cosmos-sdk/x/capability" - capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper" - capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" - "github.com/cosmos/cosmos-sdk/x/crisis" - crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types" - "github.com/cosmos/cosmos-sdk/x/distribution" - distrclient "github.com/cosmos/cosmos-sdk/x/distribution/client" - distributionkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" - distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" - "github.com/cosmos/cosmos-sdk/x/evidence" - evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" - "github.com/cosmos/cosmos-sdk/x/feegrant" - "github.com/cosmos/cosmos-sdk/x/gov" - govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - "github.com/cosmos/cosmos-sdk/x/mint" - minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" - "github.com/cosmos/cosmos-sdk/x/params" - paramsclient "github.com/cosmos/cosmos-sdk/x/params/client" - paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper" - paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" - paramproposal "github.com/cosmos/cosmos-sdk/x/params/types/proposal" - "github.com/cosmos/cosmos-sdk/x/slashing" - slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" - "github.com/cosmos/cosmos-sdk/x/staking" - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/cosmos/cosmos-sdk/x/upgrade" - upgradeclient "github.com/cosmos/cosmos-sdk/x/upgrade/client" - upgradekeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper" - upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - "github.com/cosmos/ibc-go/v4/modules/apps/transfer" - ibctransfertypes "github.com/cosmos/ibc-go/v4/modules/apps/transfer/types" - ibc "github.com/cosmos/ibc-go/v4/modules/core" - ibchost "github.com/cosmos/ibc-go/v4/modules/core/24-host" - ibckeeper "github.com/cosmos/ibc-go/v4/modules/core/keeper" - "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/ed25519" - "github.com/tendermint/tendermint/libs/log" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - - "github.com/CosmosContracts/juno/v13/x/oracle/types" - dbm "github.com/tendermint/tm-db" - - appparams "github.com/CosmosContracts/juno/v13/app/params" -) - -var moduleBasics = module.NewBasicManager( - auth.AppModuleBasic{}, - bank.AppModuleBasic{}, - capability.AppModuleBasic{}, - staking.AppModuleBasic{}, - mint.AppModuleBasic{}, - distribution.AppModuleBasic{}, - gov.NewAppModuleBasic( - paramsclient.ProposalHandler, distrclient.ProposalHandler, upgradeclient.ProposalHandler, - ), - params.AppModuleBasic{}, - crisis.AppModuleBasic{}, - slashing.AppModuleBasic{}, - ibc.AppModuleBasic{}, - upgrade.AppModuleBasic{}, - evidence.AppModuleBasic{}, - transfer.AppModuleBasic{}, - vesting.AppModuleBasic{}, -) - -func MakeTestCodec(t testing.TB) codec.Codec { - return MakeEncodingConfig(t).Marshaler -} - -func MakeEncodingConfig(_ testing.TB) appparams.EncodingConfig { - encodingConfig := appparams.MakeEncodingConfig() - amino := encodingConfig.Amino - interfaceRegistry := encodingConfig.InterfaceRegistry - - std.RegisterInterfaces(interfaceRegistry) - std.RegisterLegacyAminoCodec(amino) - - moduleBasics.RegisterLegacyAminoCodec(amino) - moduleBasics.RegisterInterfaces(interfaceRegistry) - - types.RegisterInterfaces(interfaceRegistry) - types.RegisterLegacyAminoCodec(amino) - - return encodingConfig -} - -var TestingStakeParams = stakingtypes.Params{ - UnbondingTime: 100, - MaxValidators: 10, - MaxEntries: 10, - HistoricalEntries: 10, - BondDenom: "stake", -} - -type TestFaucet struct { - t testing.TB - bankKeeper bankkeeper.Keeper - sender sdk.AccAddress - balance sdk.Coins - minterModuleName string -} - -func NewTestFaucet(t testing.TB, ctx sdk.Context, bankKeeper bankkeeper.Keeper, minterModuleName string, initialAmount ...sdk.Coin) *TestFaucet { - require.NotEmpty(t, initialAmount) - r := &TestFaucet{t: t, bankKeeper: bankKeeper, minterModuleName: minterModuleName} - _, _, addr := keyPubAddr() - r.sender = addr - r.Mint(ctx, addr, initialAmount...) - r.balance = initialAmount - return r -} - -func (f *TestFaucet) Mint(parentCtx sdk.Context, addr sdk.AccAddress, amounts ...sdk.Coin) { - require.NotEmpty(f.t, amounts) - ctx := parentCtx.WithEventManager(sdk.NewEventManager()) // discard all faucet related events - err := f.bankKeeper.MintCoins(ctx, f.minterModuleName, amounts) - require.NoError(f.t, err) - err = f.bankKeeper.SendCoinsFromModuleToAccount(ctx, f.minterModuleName, addr, amounts) - require.NoError(f.t, err) - f.balance = f.balance.Add(amounts...) -} - -func (f *TestFaucet) Fund(parentCtx sdk.Context, receiver sdk.AccAddress, amounts ...sdk.Coin) { - require.NotEmpty(f.t, amounts) - // ensure faucet is always filled - if !f.balance.IsAllGTE(amounts) { - f.Mint(parentCtx, f.sender, amounts...) - } - ctx := parentCtx.WithEventManager(sdk.NewEventManager()) // discard all faucet related events - err := f.bankKeeper.SendCoins(ctx, f.sender, receiver, amounts) - require.NoError(f.t, err) - f.balance = f.balance.Sub(amounts) -} - -func (f *TestFaucet) NewFundedRandomAccount(ctx sdk.Context, amounts ...sdk.Coin) sdk.AccAddress { - _, _, addr := keyPubAddr() - f.Fund(ctx, addr, amounts...) - return addr -} - -type TestKeepers struct { - AccountKeeper authkeeper.AccountKeeper - StakingKeeper stakingkeeper.Keeper - DistKeeper distributionkeeper.Keeper - BankKeeper bankkeeper.Keeper - GovKeeper govkeeper.Keeper - OracleKeeper Keeper - IBCKeeper *ibckeeper.Keeper - Router *baseapp.Router - EncodingConfig appparams.EncodingConfig - Faucet *TestFaucet - MultiStore sdk.CommitMultiStore -} - -// CreateDefaultTestInput common settings for CreateTestInput -func CreateDefaultTestInput(t testing.TB) (sdk.Context, TestKeepers) { - return CreateTestInput(t, false) -} - -// CreateTestInput encoders can be nil to accept the defaults, or set it to override some of the message handlers (like default) -func CreateTestInput(t testing.TB, isCheckTx bool) (sdk.Context, TestKeepers) { - // Load default wasm config - return createTestInput(t, isCheckTx, dbm.NewMemDB()) -} - -func createTestInput( - t testing.TB, - isCheckTx bool, - db dbm.DB, -) (sdk.Context, TestKeepers) { - tempDir := t.TempDir() - - keys := sdk.NewKVStoreKeys( - authtypes.StoreKey, banktypes.StoreKey, stakingtypes.StoreKey, - minttypes.StoreKey, distributiontypes.StoreKey, slashingtypes.StoreKey, - govtypes.StoreKey, paramstypes.StoreKey, ibchost.StoreKey, upgradetypes.StoreKey, - evidencetypes.StoreKey, ibctransfertypes.StoreKey, - capabilitytypes.StoreKey, feegrant.StoreKey, authzkeeper.StoreKey, - types.StoreKey, - ) - ms := store.NewCommitMultiStore(db) - for _, v := range keys { - ms.MountStoreWithDB(v, sdk.StoreTypeIAVL, db) - } - tkeys := sdk.NewTransientStoreKeys(paramstypes.TStoreKey) - for _, v := range tkeys { - ms.MountStoreWithDB(v, sdk.StoreTypeTransient, db) - } - - memKeys := sdk.NewMemoryStoreKeys(capabilitytypes.MemStoreKey) - for _, v := range memKeys { - ms.MountStoreWithDB(v, sdk.StoreTypeMemory, db) - } - - require.NoError(t, ms.LoadLatestVersion()) - - ctx := sdk.NewContext(ms, tmproto.Header{ - Height: 1234567, - Time: time.Date(2020, time.April, 22, 12, 0, 0, 0, time.UTC), - }, isCheckTx, log.NewNopLogger()) - - encodingConfig := MakeEncodingConfig(t) - appCodec, legacyAmino := encodingConfig.Marshaler, encodingConfig.Amino - - paramsKeeper := paramskeeper.NewKeeper( - appCodec, - legacyAmino, - keys[paramstypes.StoreKey], - tkeys[paramstypes.TStoreKey], - ) - for _, m := range []string{ - authtypes.ModuleName, - banktypes.ModuleName, - stakingtypes.ModuleName, - minttypes.ModuleName, - distributiontypes.ModuleName, - slashingtypes.ModuleName, - crisistypes.ModuleName, - ibctransfertypes.ModuleName, - capabilitytypes.ModuleName, - ibchost.ModuleName, - govtypes.ModuleName, - types.ModuleName, - } { - paramsKeeper.Subspace(m) - } - subspace := func(m string) paramstypes.Subspace { - r, ok := paramsKeeper.GetSubspace(m) - require.True(t, ok) - return r - } - maccPerms := map[string][]string{ // module account permissions - authtypes.FeeCollectorName: nil, - distributiontypes.ModuleName: nil, - minttypes.ModuleName: {authtypes.Minter}, - stakingtypes.BondedPoolName: {authtypes.Burner, authtypes.Staking}, - stakingtypes.NotBondedPoolName: {authtypes.Burner, authtypes.Staking}, - govtypes.ModuleName: {authtypes.Burner}, - ibctransfertypes.ModuleName: {authtypes.Minter, authtypes.Burner}, - types.ModuleName: nil, - } - accountKeeper := authkeeper.NewAccountKeeper( - appCodec, - keys[authtypes.StoreKey], // target store - subspace(authtypes.ModuleName), - authtypes.ProtoBaseAccount, // prototype - maccPerms, - ) - blockedAddrs := make(map[string]bool) - for acc := range maccPerms { - blockedAddrs[authtypes.NewModuleAddress(acc).String()] = true - } - - bankKeeper := bankkeeper.NewBaseKeeper( - appCodec, - keys[banktypes.StoreKey], - accountKeeper, - subspace(banktypes.ModuleName), - blockedAddrs, - ) - bankKeeper.SetParams(ctx, banktypes.DefaultParams()) - - stakingKeeper := stakingkeeper.NewKeeper( - appCodec, - keys[stakingtypes.StoreKey], - accountKeeper, - bankKeeper, - subspace(stakingtypes.ModuleName), - ) - stakingKeeper.SetParams(ctx, TestingStakeParams) - - distKeeper := distributionkeeper.NewKeeper( - appCodec, - keys[distributiontypes.StoreKey], - subspace(distributiontypes.ModuleName), - accountKeeper, - bankKeeper, - stakingKeeper, - authtypes.FeeCollectorName, - nil, - ) - distKeeper.SetParams(ctx, distributiontypes.DefaultParams()) - stakingKeeper.SetHooks(distKeeper.Hooks()) - - // set genesis items required for distribution - distKeeper.SetFeePool(ctx, distributiontypes.InitialFeePool()) - - upgradeKeeper := upgradekeeper.NewKeeper( - map[int64]bool{}, - keys[upgradetypes.StoreKey], - appCodec, - tempDir, - nil, - ) - - faucet := NewTestFaucet(t, ctx, bankKeeper, minttypes.ModuleName, sdk.NewCoin("stake", sdk.NewInt(100_000_000_000))) - - // set some funds ot pay out validatores, based on code from: - // https://github.com/cosmos/cosmos-sdk/blob/fea231556aee4d549d7551a6190389c4328194eb/x/distribution/keeper/keeper_test.go#L50-L57 - distrAcc := distKeeper.GetDistributionAccount(ctx) - faucet.Fund(ctx, distrAcc.GetAddress(), sdk.NewCoin("stake", sdk.NewInt(2000000))) - accountKeeper.SetModuleAccount(ctx, distrAcc) - - capabilityKeeper := capabilitykeeper.NewKeeper( - appCodec, - keys[capabilitytypes.StoreKey], - memKeys[capabilitytypes.MemStoreKey], - ) - scopedIBCKeeper := capabilityKeeper.ScopeToModule(ibchost.ModuleName) - - ibcKeeper := ibckeeper.NewKeeper( - appCodec, - keys[ibchost.StoreKey], - subspace(ibchost.ModuleName), - stakingKeeper, - upgradeKeeper, - scopedIBCKeeper, - ) - - router := baseapp.NewRouter() - bh := bank.NewHandler(bankKeeper) - router.AddRoute(sdk.NewRoute(banktypes.RouterKey, bh)) - sh := staking.NewHandler(stakingKeeper) - router.AddRoute(sdk.NewRoute(stakingtypes.RouterKey, sh)) - dh := distribution.NewHandler(distKeeper) - router.AddRoute(sdk.NewRoute(distributiontypes.RouterKey, dh)) - - querier := baseapp.NewGRPCQueryRouter() - querier.SetInterfaceRegistry(encodingConfig.InterfaceRegistry) - msgRouter := baseapp.NewMsgServiceRouter() - msgRouter.SetInterfaceRegistry(encodingConfig.InterfaceRegistry) - - keeper := NewKeeper( - appCodec, - keys[types.StoreKey], - subspace(types.ModuleName), - accountKeeper, - bankKeeper, - distKeeper, - stakingKeeper, - distributiontypes.ModuleName, - ) - keeper.SetParams(ctx, types.DefaultParams()) - router.AddRoute(sdk.NewRoute(types.RouterKey, TestHandler(keeper))) - - am := module.NewManager( // minimal module set that we use for message/ query tests - bank.NewAppModule(appCodec, bankKeeper, accountKeeper), - staking.NewAppModule(appCodec, stakingKeeper, accountKeeper, bankKeeper), - distribution.NewAppModule(appCodec, distKeeper, accountKeeper, bankKeeper, stakingKeeper), - ) - am.RegisterServices(module.NewConfigurator(appCodec, msgRouter, querier)) - types.RegisterMsgServer(msgRouter, NewMsgServerImpl(keeper)) - types.RegisterQueryServer(querier, NewQuerier(keeper)) - - govRouter := govtypes.NewRouter(). - AddRoute(govtypes.RouterKey, govtypes.ProposalHandler). - AddRoute(paramproposal.RouterKey, params.NewParamChangeProposalHandler(paramsKeeper)). - AddRoute(distributiontypes.RouterKey, distribution.NewCommunityPoolSpendProposalHandler(distKeeper)). - AddRoute(types.RouterKey, NewOracleProposalHandler(keeper)) - - govKeeper := govkeeper.NewKeeper( - appCodec, - keys[govtypes.StoreKey], - subspace(govtypes.ModuleName).WithKeyTable(govtypes.ParamKeyTable()), - accountKeeper, - bankKeeper, - stakingKeeper, - govRouter, - ) - - govKeeper.SetProposalID(ctx, govtypes.DefaultStartingProposalID) - govKeeper.SetDepositParams(ctx, govtypes.DefaultDepositParams()) - govKeeper.SetVotingParams(ctx, govtypes.DefaultVotingParams()) - govKeeper.SetTallyParams(ctx, govtypes.DefaultTallyParams()) - - keepers := TestKeepers{ - AccountKeeper: accountKeeper, - StakingKeeper: stakingKeeper, - DistKeeper: distKeeper, - BankKeeper: bankKeeper, - GovKeeper: govKeeper, - OracleKeeper: keeper, - IBCKeeper: ibcKeeper, - Router: router, - EncodingConfig: encodingConfig, - Faucet: faucet, - MultiStore: ms, - } - return ctx, keepers -} - -func TestHandler(k Keeper) sdk.Handler { - return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - // ctx = ctx.WithEventManager(sdk.NewEventManager()) - switch msg := msg.(type) { //nolint:gocritic - default: - errMsg := fmt.Sprintf("unrecognized wasm message type: %T", msg) - return nil, sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, errMsg) - } - } -} - -var keyCounter uint64 - -// we need to make this deterministic (same every test run), as encoded address size and thus gas cost, -// depends on the actual bytes (due to ugly CanonicalAddress encoding) -func keyPubAddr() (crypto.PrivKey, crypto.PubKey, sdk.AccAddress) { //nolint:unparam - keyCounter++ - seed := make([]byte, 8) - binary.BigEndian.PutUint64(seed, keyCounter) - - key := ed25519.GenPrivKeyFromSecret(seed) - pub := key.PubKey() - addr := sdk.AccAddress(pub.Address()) - return key, pub, addr -} diff --git a/x/oracle/module.go b/x/oracle/module.go deleted file mode 100644 index bb720ea4a..000000000 --- a/x/oracle/module.go +++ /dev/null @@ -1,211 +0,0 @@ -package oracle - -import ( - "context" - "encoding/json" - "fmt" - "math/rand" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/codec" - cdctypes "github.com/cosmos/cosmos-sdk/codec/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" - bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - "github.com/gorilla/mux" - "github.com/grpc-ecosystem/grpc-gateway/runtime" - "github.com/spf13/cobra" - abci "github.com/tendermint/tendermint/abci/types" - - "github.com/CosmosContracts/juno/v13/x/oracle/client/cli" - "github.com/CosmosContracts/juno/v13/x/oracle/keeper" - "github.com/CosmosContracts/juno/v13/x/oracle/simulation" - "github.com/CosmosContracts/juno/v13/x/oracle/types" - simtypes "github.com/cosmos/cosmos-sdk/types/simulation" -) - -var ( - _ module.AppModule = AppModule{} - _ module.AppModuleBasic = AppModuleBasic{} -) - -// AppModuleBasic implements the AppModuleBasic interface for the x/oracle module. -type AppModuleBasic struct { - cdc codec.Codec -} - -// RegisterLegacyAminoCodec registers the x/oracle module's types with a legacy -// Amino codec. -func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { - types.RegisterLegacyAminoCodec(cdc) -} - -func NewAppModuleBasic(cdc codec.Codec) AppModuleBasic { - return AppModuleBasic{cdc: cdc} -} - -// Name returns the x/oracle module's name. -func (AppModuleBasic) Name() string { - return types.ModuleName -} - -func (AppModuleBasic) ConsensusVersion() uint64 { - return 1 -} - -// RegisterInterfaces registers the x/oracle module's interface types. -func (AppModuleBasic) RegisterInterfaces(reg cdctypes.InterfaceRegistry) { - types.RegisterInterfaces(reg) -} - -// DefaultGenesis returns the x/oracle module's default genesis state. -func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { - return cdc.MustMarshalJSON(types.DefaultGenesisState()) -} - -// ValidateGenesis performs genesis state validation for the x/oracle module. -func (AppModuleBasic) ValidateGenesis( - cdc codec.JSONCodec, - config client.TxEncodingConfig, - bz json.RawMessage, -) error { - var genState types.GenesisState - if err := cdc.UnmarshalJSON(bz, &genState); err != nil { - return fmt.Errorf("failed to unmarshal %s genesis state: %w", types.ModuleName, err) - } - - return nil -} - -// Deprecated: RegisterRESTRoutes performs a no-op. Querying is delegated to the -// gRPC service. -func (AppModuleBasic) RegisterRESTRoutes(clientCtx client.Context, rtr *mux.Router) {} - -// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the x/oracle -// module. -func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *runtime.ServeMux) { - if err := types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx)); err != nil { - panic(err) - } -} - -// GetTxCmd returns the x/oracle module's root tx command. -func (AppModuleBasic) GetTxCmd() *cobra.Command { - return cli.GetTxCmd() -} - -// GetQueryCmd returns the x/oracle module's root query command. -func (AppModuleBasic) GetQueryCmd() *cobra.Command { - return cli.GetQueryCmd(types.StoreKey) -} - -// AppModule implements the AppModule interface for the x/oracle module. -type AppModule struct { - AppModuleBasic - - keeper keeper.Keeper - accountKeeper types.AccountKeeper - bankKeeper bankkeeper.Keeper -} - -func NewAppModule( - cdc codec.Codec, - keeper keeper.Keeper, - accountKeeper types.AccountKeeper, - bankKeeper bankkeeper.Keeper, -) AppModule { - return AppModule{ - AppModuleBasic: NewAppModuleBasic(cdc), - keeper: keeper, - accountKeeper: accountKeeper, - bankKeeper: bankKeeper, - } -} - -// Name returns the x/oracle module's name. -func (am AppModule) Name() string { - return am.AppModuleBasic.Name() -} - -// Deprecated: Route returns the message routing key for the x/oracle module. -func (am AppModule) Route() sdk.Route { - return sdk.Route{} -} - -// QuerierRoute returns the x/oracle module's query routing key. -func (AppModule) QuerierRoute() string { return types.QuerierRoute } - -// LegacyQuerierHandler returns a no-op legacy querier. -func (am AppModule) LegacyQuerierHandler(legacyQuerierCdc *codec.LegacyAmino) sdk.Querier { - return func(sdk.Context, []string, abci.RequestQuery) ([]byte, error) { - return nil, fmt.Errorf("legacy querier not supported for the x/%s module", types.ModuleName) - } -} - -// RegisterServices registers gRPC services. -func (am AppModule) RegisterServices(cfg module.Configurator) { - types.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(am.keeper)) - types.RegisterQueryServer(cfg.QueryServer(), keeper.NewQuerier(am.keeper)) -} - -// RegisterInvariants registers the x/oracle module's invariants. -func (am AppModule) RegisterInvariants(_ sdk.InvariantRegistry) {} - -// InitGenesis performs the x/oracle module's genesis initialization. It returns -// no validator updates. -func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, gs json.RawMessage) []abci.ValidatorUpdate { - var genState types.GenesisState - - cdc.MustUnmarshalJSON(gs, &genState) - InitGenesis(ctx, am.keeper, genState) - - return []abci.ValidatorUpdate{} -} - -// ExportGenesis returns the x/oracle module's exported genesis state as raw -// JSON bytes. -func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.RawMessage { - genState := ExportGenesis(ctx, am.keeper) - return cdc.MustMarshalJSON(genState) -} - -// BeginBlock executes all ABCI BeginBlock logic respective to the x/oracle module. -func (am AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) {} - -// EndBlock executes all ABCI EndBlock logic respective to the x/oracle module. -// It returns no validator updates. -func (am AppModule) EndBlock(ctx sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate { - if err := EndBlocker(ctx, am.keeper); err != nil { - panic(err) - } - - return []abci.ValidatorUpdate{} -} - -// GenerateGenesisState creates a randomized GenState of the distribution module. -func (AppModule) GenerateGenesisState(simState *module.SimulationState) { - simulation.RandomizedGenState(simState) -} - -// WeightedOperations returns the all the gravity module operations with their respective weights. -func (am AppModule) WeightedOperations(simState module.SimulationState) []simtypes.WeightedOperation { - return simulation.WeightedOperations( - &simState, am.accountKeeper, am.bankKeeper, am.keeper, - ) -} - -// ProposalContents returns all the oracle content functions used to -// simulate governance proposals. -func (am AppModule) ProposalContents(_ module.SimulationState) []simtypes.WeightedProposalContent { - return nil -} - -// RandomizedParams creates randomized oracle param changes for the simulator. -func (AppModule) RandomizedParams(r *rand.Rand) []simtypes.ParamChange { - return simulation.ParamChanges(r) -} - -// RegisterStoreDecoder registers a decoder for oracle module's types -func (am AppModule) RegisterStoreDecoder(sdr sdk.StoreDecoderRegistry) { - sdr[types.StoreKey] = simulation.NewDecodeStore(am.cdc) -} diff --git a/x/oracle/simulation/decoder.go b/x/oracle/simulation/decoder.go deleted file mode 100644 index 564741640..000000000 --- a/x/oracle/simulation/decoder.go +++ /dev/null @@ -1,49 +0,0 @@ -package simulation - -import ( - "bytes" - "fmt" - - "github.com/CosmosContracts/juno/v13/x/oracle/types" - gogotypes "github.com/gogo/protobuf/types" - - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/kv" -) - -func NewDecodeStore(cdc codec.Codec) func(kvA, kvB kv.Pair) string { - return func(kvA, kvB kv.Pair) string { - switch { - case bytes.Equal(kvA.Key[:1], types.KeyPrefixExchangeRate): - var exchangeRateA, exchangeRateB sdk.DecProto - cdc.MustUnmarshal(kvA.Value, &exchangeRateA) - cdc.MustUnmarshal(kvB.Value, &exchangeRateB) - return fmt.Sprintf("%v\n%v", exchangeRateA, exchangeRateB) - - case bytes.Equal(kvA.Key[:1], types.KeyPrefixFeederDelegation): - return fmt.Sprintf("%v\n%v", sdk.AccAddress(kvA.Value), sdk.AccAddress(kvB.Value)) - - case bytes.Equal(kvA.Key[:1], types.KeyPrefixMissCounter): - var counterA, counterB gogotypes.UInt64Value - cdc.MustUnmarshal(kvA.Value, &counterA) - cdc.MustUnmarshal(kvB.Value, &counterB) - return fmt.Sprintf("%v\n%v", counterA.Value, counterB.Value) - - case bytes.Equal(kvA.Key[:1], types.KeyPrefixAggregateExchangeRatePrevote): - var prevoteA, prevoteB types.AggregateExchangeRatePrevote - cdc.MustUnmarshal(kvA.Value, &prevoteA) - cdc.MustUnmarshal(kvB.Value, &prevoteB) - return fmt.Sprintf("%v\n%v", prevoteA, prevoteB) - - case bytes.Equal(kvA.Key[:1], types.KeyPrefixAggregateExchangeRateVote): - var voteA, voteB types.AggregateExchangeRateVote - cdc.MustUnmarshal(kvA.Value, &voteA) - cdc.MustUnmarshal(kvB.Value, &voteB) - return fmt.Sprintf("%v\n%v", voteA, voteB) - - default: - panic(fmt.Sprintf("invalid oracle key prefix %X", kvA.Key[:1])) - } - } -} diff --git a/x/oracle/simulation/genesis.go b/x/oracle/simulation/genesis.go deleted file mode 100644 index 01e54648d..000000000 --- a/x/oracle/simulation/genesis.go +++ /dev/null @@ -1,145 +0,0 @@ -package simulation - -import ( - "encoding/json" - "fmt" - "math/rand" - "time" - - "github.com/CosmosContracts/juno/v13/x/oracle/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" -) - -const ( - votePeriodKey = "vote_period" - voteThresholdKey = "vote_threshold" - rewardBandKey = "reward_band" - rewardDistributionWindowKey = "reward_distribution_window" - slashFractionKey = "slash_fraction" - slashWindowKey = "slash_window" - minValidPerWindowKey = "min_valid_per_window" - TwapTrackingDurationKey = "twap_tracking_duration" -) - -// GenVotePeriod produces a randomized VotePeriod in the range of [5, 100] -func GenVotePeriod(r *rand.Rand) uint64 { - return uint64(5 + r.Intn(100)) -} - -// GenVoteThreshold produces a randomized VoteThreshold in the range of [0.333, 0.666] -func GenVoteThreshold(r *rand.Rand) sdk.Dec { - return sdk.NewDecWithPrec(333, 3).Add(sdk.NewDecWithPrec(int64(r.Intn(333)), 3)) -} - -// GenRewardBand produces a randomized RewardBand in the range of [0.000, 0.100] -func GenRewardBand(r *rand.Rand) sdk.Dec { - return sdk.ZeroDec().Add(sdk.NewDecWithPrec(int64(r.Intn(100)), 3)) -} - -// GenRewardDistributionWindow produces a randomized RewardDistributionWindow in the range of [100, 100000] -func GenRewardDistributionWindow(r *rand.Rand) uint64 { - return uint64(100 + r.Intn(100000)) -} - -// GenSlashFraction produces a randomized SlashFraction in the range of [0.000, 0.100] -func GenSlashFraction(r *rand.Rand) sdk.Dec { - return sdk.ZeroDec().Add(sdk.NewDecWithPrec(int64(r.Intn(100)), 3)) -} - -// GenSlashWindow produces a randomized SlashWindow in the range of [100, 100000] -func GenSlashWindow(r *rand.Rand) uint64 { - return uint64(100 + r.Intn(100000)) -} - -// GenMinValidPerWindow produces a randomized MinValidPerWindow in the range of [0, 0.500] -func GenMinValidPerWindow(r *rand.Rand) sdk.Dec { - return sdk.ZeroDec().Add(sdk.NewDecWithPrec(int64(r.Intn(500)), 3)) -} - -func GenTwapTrackingDuration(r *rand.Rand) time.Duration { - return time.Second * time.Duration((100 + r.Int63n(1_000_000))) -} - -// RandomizedGenState generates a random GenesisState for oracle -func RandomizedGenState(simState *module.SimulationState) { - var votePeriod uint64 - simState.AppParams.GetOrGenerate( - simState.Cdc, votePeriodKey, &votePeriod, simState.Rand, - func(r *rand.Rand) { votePeriod = GenVotePeriod(r) }, - ) - - var voteThreshold sdk.Dec - simState.AppParams.GetOrGenerate( - simState.Cdc, voteThresholdKey, &voteThreshold, simState.Rand, - func(r *rand.Rand) { voteThreshold = GenVoteThreshold(r) }, - ) - - var rewardBand sdk.Dec - simState.AppParams.GetOrGenerate( - simState.Cdc, rewardBandKey, &rewardBand, simState.Rand, - func(r *rand.Rand) { rewardBand = GenRewardBand(r) }, - ) - - var rewardDistributionWindow uint64 - simState.AppParams.GetOrGenerate( - simState.Cdc, rewardDistributionWindowKey, &rewardDistributionWindow, simState.Rand, - func(r *rand.Rand) { rewardDistributionWindow = GenRewardDistributionWindow(r) }, - ) - - var slashFraction sdk.Dec - simState.AppParams.GetOrGenerate( - simState.Cdc, slashFractionKey, &slashFraction, simState.Rand, - func(r *rand.Rand) { slashFraction = GenSlashFraction(r) }, - ) - - var slashWindow uint64 - simState.AppParams.GetOrGenerate( - simState.Cdc, slashWindowKey, &slashWindow, simState.Rand, - func(r *rand.Rand) { slashWindow = GenSlashWindow(r) }, - ) - - var minValidPerWindow sdk.Dec - simState.AppParams.GetOrGenerate( - simState.Cdc, minValidPerWindowKey, &minValidPerWindow, simState.Rand, - func(r *rand.Rand) { minValidPerWindow = GenMinValidPerWindow(r) }, - ) - - var TwapTrackingDuration time.Duration - simState.AppParams.GetOrGenerate( - simState.Cdc, TwapTrackingDurationKey, &TwapTrackingDuration, simState.Rand, - func(r *rand.Rand) { TwapTrackingDuration = GenTwapTrackingDuration(r) }, - ) - - oracleGenesis := types.NewGenesisState( - types.Params{ - VotePeriod: votePeriod, - VoteThreshold: voteThreshold, - RewardBand: rewardBand, - RewardDistributionWindow: rewardDistributionWindow, - Whitelist: types.DenomList{ - {SymbolDenom: types.JunoSymbol, BaseDenom: types.JunoDenom}, - }, - SlashFraction: slashFraction, - SlashWindow: slashWindow, - MinValidPerWindow: minValidPerWindow, - TwapTrackingList: types.DenomList{ - {SymbolDenom: types.JunoSymbol, BaseDenom: types.JunoDenom}, - }, - TwapDuration: TwapTrackingDuration, - }, - []types.ExchangeRateTuple{}, - []types.FeederDelegation{}, - []types.MissCounter{}, - []types.AggregateExchangeRatePrevote{}, - []types.AggregateExchangeRateVote{}, - []types.PriceHistory{}, - ) - - bz, err := json.MarshalIndent(&oracleGenesis.Params, "", " ") - if err != nil { - panic(err) - } - fmt.Printf("Selected randomly generated oracle parameters:\n%s\n", bz) - simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(oracleGenesis) -} diff --git a/x/oracle/simulation/operations.go b/x/oracle/simulation/operations.go deleted file mode 100644 index 29074b581..000000000 --- a/x/oracle/simulation/operations.go +++ /dev/null @@ -1,240 +0,0 @@ -package simulation - -import ( - "fmt" - "math/rand" - "sort" - "strings" - - "github.com/CosmosContracts/juno/v13/x/oracle/keeper" - "github.com/CosmosContracts/juno/v13/x/oracle/types" - "github.com/cosmos/cosmos-sdk/baseapp" - "github.com/cosmos/cosmos-sdk/codec" - simappparams "github.com/cosmos/cosmos-sdk/simapp/params" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" - simtypes "github.com/cosmos/cosmos-sdk/types/simulation" - bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - "github.com/cosmos/cosmos-sdk/x/simulation" -) - -// Simulation operation weights constants -// -//nolint:gosec -const ( - OpWeightMsgAggregateExchangeRatePrevote = "op_weight_msg_exchange_rate_aggregate_prevote" - OpWeightMsgAggregateExchangeRateVote = "op_weight_msg_exchange_rate_aggregate_vote" - OpWeightMsgDelegateFeedConsent = "op_weight_msg_exchange_feed_consent" - - salt = "89b8164ca0b4b8703ae9ab25962f3dd6d1de5d656f5442971a93b2ca7893f654" -) - -var ( - Whitelist = []string{types.JunoSymbol, types.USDDenom} - junoPrice = sdk.MustNewDecFromStr("25.71") -) - -// GenerateExchangeRatesString generates a canonical string representation of -// the aggregated exchange rates. -func GenerateExchangeRatesString(prices map[string]sdk.Dec) string { - exchangeRates := make([]string, len(prices)) - i := 0 - - // aggregate exchange rates as ":" - for base, avgPrice := range prices { - exchangeRates[i] = fmt.Sprintf("%s:%s", base, avgPrice.String()) - i++ - } - - sort.Strings(exchangeRates) - - return strings.Join(exchangeRates, ",") -} - -func WeightedOperations( - simstate *module.SimulationState, - ak types.AccountKeeper, - bk bankkeeper.Keeper, - k keeper.Keeper, -) simulation.WeightedOperations { - var ( - weightMsgAggregateExchangeRatePrevote int - weightMsgAggregateExchangeRateVote int - weightMsgDelegateFeedConsent int - voteHashMap = make(map[string]string) - ) - - simstate.AppParams.GetOrGenerate(simstate.Cdc, OpWeightMsgAggregateExchangeRatePrevote, &weightMsgAggregateExchangeRatePrevote, nil, - func(_ *rand.Rand) { - weightMsgAggregateExchangeRatePrevote = simappparams.DefaultWeightMsgSend * 2 - }, - ) - simstate.AppParams.GetOrGenerate(simstate.Cdc, OpWeightMsgAggregateExchangeRateVote, &weightMsgAggregateExchangeRateVote, nil, - func(_ *rand.Rand) { - weightMsgAggregateExchangeRateVote = simappparams.DefaultWeightMsgSend * 2 - }, - ) - simstate.AppParams.GetOrGenerate(simstate.Cdc, OpWeightMsgDelegateFeedConsent, &weightMsgDelegateFeedConsent, nil, - func(_ *rand.Rand) { - weightMsgDelegateFeedConsent = simappparams.DefaultWeightMsgSetWithdrawAddress - }, - ) - - return simulation.WeightedOperations{ - simulation.NewWeightedOperation( - weightMsgAggregateExchangeRatePrevote, - SimulateMsgAggregateExchangeRatePrevote(ak, bk, k, voteHashMap), - ), - simulation.NewWeightedOperation( - weightMsgAggregateExchangeRateVote, - SimulateMsgAggregateExchangeRateVote(ak, bk, k, voteHashMap), - ), - simulation.NewWeightedOperation( - weightMsgDelegateFeedConsent, - SimulateMsgDelegateFeedConsent(ak, bk, k), - ), - } -} - -// SimulateMsgAggregateExchangeRatePrevote generates a MsgAggregateExchangeRatePrevote with random values. -func SimulateMsgAggregateExchangeRatePrevote( - ak types.AccountKeeper, - bk bankkeeper.Keeper, - k keeper.Keeper, - voteHashMap map[string]string, -) simtypes.Operation { - return func( - r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, - ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { - simAccount := accs[1] // , _ := simtypes.RandomAcc(r, accs) - address := sdk.ValAddress(simAccount.Address) - noop := func(comment string) simtypes.OperationMsg { - return simtypes.NoOpMsg(types.ModuleName, sdk.MsgTypeURL(new(types.MsgAggregateExchangeRatePrevote)), comment) - } - - // ensure the validator exists - val := k.StakingKeeper.Validator(ctx, address) - if val == nil || !val.IsBonded() { - return noop("unable to find validator"), nil, nil - } - - // check for an existing prevote - _, err := k.GetAggregateExchangeRatePrevote(ctx, address) - if err == nil { - return noop("prevote already exists for this validator"), nil, nil - } - - prices := make(map[string]sdk.Dec, len(Whitelist)) - for _, denom := range Whitelist { - prices[denom] = junoPrice.Add(simtypes.RandomDecAmount(r, sdk.NewDec(1))) - } - - exchangeRatesStr := GenerateExchangeRatesString(prices) - voteHash := types.GetAggregateVoteHash(salt, exchangeRatesStr, address) - feederAddr, _ := k.GetFeederDelegation(ctx, address) - feederSimAccount, _ := simtypes.FindAccount(accs, feederAddr) - msg := types.NewMsgAggregateExchangeRatePrevote(voteHash, feederAddr, address) - voteHashMap[address.String()] = exchangeRatesStr - - return deliver(r, app, ctx, ak, bk, feederSimAccount, msg, nil) - } -} - -// SimulateMsgAggregateExchangeRateVote generates a MsgAggregateExchangeRateVote with random values. -func SimulateMsgAggregateExchangeRateVote( - ak types.AccountKeeper, - bk bankkeeper.Keeper, - k keeper.Keeper, - voteHashMap map[string]string, -) simtypes.Operation { - return func( - r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, - ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { - simAccount, _ := simtypes.RandomAcc(r, accs) - address := sdk.ValAddress(simAccount.Address) - noop := func(comment string) simtypes.OperationMsg { - return simtypes.NoOpMsg(types.ModuleName, sdk.MsgTypeURL(new(types.MsgAggregateExchangeRateVote)), comment) - } - - // ensure the validator exists - val := k.StakingKeeper.Validator(ctx, address) - if val == nil || !val.IsBonded() { - return noop("unable to find validator"), nil, nil - } - - // ensure vote hash exists - exchangeRatesStr, ok := voteHashMap[address.String()] - if !ok { - return noop("vote hash does not exist"), nil, nil - } - - // get prevote - prevote, err := k.GetAggregateExchangeRatePrevote(ctx, address) - if err != nil { - return noop("prevote not found"), nil, nil - } - - params := k.GetParams(ctx) - if (uint64(ctx.BlockHeight())/params.VotePeriod)-(prevote.SubmitBlock/params.VotePeriod) != 1 { - return noop("reveal period of submitted vote does not match with registered prevote"), nil, nil - } - - feederAddr, _ := k.GetFeederDelegation(ctx, address) - feederSimAccount, _ := simtypes.FindAccount(accs, feederAddr) - msg := types.NewMsgAggregateExchangeRateVote(salt, exchangeRatesStr, feederAddr, address) - - return deliver(r, app, ctx, ak, bk, feederSimAccount, msg, nil) - } -} - -// SimulateMsgDelegateFeedConsent generates a MsgDelegateFeedConsent with random values. -func SimulateMsgDelegateFeedConsent(ak types.AccountKeeper, bk bankkeeper.Keeper, k keeper.Keeper) simtypes.Operation { - return func( - r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, - ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { - simAccount, _ := simtypes.RandomAcc(r, accs) - delegateAccount, _ := simtypes.RandomAcc(r, accs) - valAddress := sdk.ValAddress(simAccount.Address) - delegateValAddress := sdk.ValAddress(delegateAccount.Address) - noop := func(comment string) simtypes.OperationMsg { - return simtypes.NoOpMsg(types.ModuleName, sdk.MsgTypeURL(new(types.MsgDelegateFeedConsent)), comment) - } - - // ensure the validator exists - val := k.StakingKeeper.Validator(ctx, valAddress) - if val == nil { - return noop("unable to find validator"), nil, nil - } - - // ensure the target address is not a validator - val2 := k.StakingKeeper.Validator(ctx, delegateValAddress) - if val2 != nil { - return noop("unable to delegate to validator"), nil, nil - } - - msg := types.NewMsgDelegateFeedConsent(valAddress, delegateAccount.Address) - return deliver(r, app, ctx, ak, bk, simAccount, msg, nil) - } -} - -func deliver(r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, ak simulation.AccountKeeper, - bk bankkeeper.Keeper, from simtypes.Account, msg sdk.Msg, coins sdk.Coins, -) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { - cfg := simappparams.MakeTestEncodingConfig() - txCtx := simulation.OperationInput{ - R: r, - App: app, - TxGen: cfg.TxConfig, - Cdc: cfg.Marshaler.(*codec.ProtoCodec), - Msg: msg, - MsgType: sdk.MsgTypeURL(msg), - Context: ctx, - SimAccount: from, - AccountKeeper: ak, - Bankkeeper: bk, - ModuleName: types.ModuleName, - CoinsSpentInMsg: coins, - } - - return simulation.GenAndDeliverTxWithRandFees(txCtx) -} diff --git a/x/oracle/simulation/params.go b/x/oracle/simulation/params.go deleted file mode 100644 index 58c607463..000000000 --- a/x/oracle/simulation/params.go +++ /dev/null @@ -1,52 +0,0 @@ -package simulation - -import ( - "fmt" - "math/rand" - - "github.com/CosmosContracts/juno/v13/x/oracle/types" - simtypes "github.com/cosmos/cosmos-sdk/types/simulation" - "github.com/cosmos/cosmos-sdk/x/simulation" -) - -// ParamChanges defines the parameters that can be modified by param change proposals -// on the simulation -func ParamChanges(r *rand.Rand) []simtypes.ParamChange { - return []simtypes.ParamChange{ - simulation.NewSimParamChange(types.ModuleName, string(types.KeyVotePeriod), - func(r *rand.Rand) string { - return fmt.Sprintf("\"%d\"", GenVotePeriod(r)) - }, - ), - simulation.NewSimParamChange(types.ModuleName, string(types.KeyVoteThreshold), - func(r *rand.Rand) string { - return fmt.Sprintf("\"%s\"", GenVoteThreshold(r)) - }, - ), - simulation.NewSimParamChange(types.ModuleName, string(types.KeyRewardBand), - func(r *rand.Rand) string { - return fmt.Sprintf("\"%s\"", GenRewardBand(r)) - }, - ), - simulation.NewSimParamChange(types.ModuleName, string(types.KeyRewardDistributionWindow), - func(r *rand.Rand) string { - return fmt.Sprintf("\"%d\"", GenRewardDistributionWindow(r)) - }, - ), - simulation.NewSimParamChange(types.ModuleName, string(types.KeySlashFraction), - func(r *rand.Rand) string { - return fmt.Sprintf("\"%s\"", GenSlashFraction(r)) - }, - ), - simulation.NewSimParamChange(types.ModuleName, string(types.KeySlashWindow), - func(r *rand.Rand) string { - return fmt.Sprintf("\"%d\"", GenSlashWindow(r)) - }, - ), - simulation.NewSimParamChange(types.ModuleName, string(types.KeyTwapDuration), - func(r *rand.Rand) string { - return fmt.Sprintf("\"%d\"", GenTwapTrackingDuration(r)) - }, - ), - } -} diff --git a/x/oracle/types/asset.go b/x/oracle/types/asset.go deleted file mode 100644 index 5705dbdf3..000000000 --- a/x/oracle/types/asset.go +++ /dev/null @@ -1,48 +0,0 @@ -package types - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - - appparams "github.com/CosmosContracts/juno/v13/app/params" -) - -const ( - JunoDenom string = appparams.BondDenom - JunoSymbol string = "JUNO" - JunoExponent = uint32(6) - AtomDenom string = "ibc/C4CFF46FD6DE35CA4CF4CE031E643C8FDC9BA4B99AE598E9B0ED98FE3A2319F9" - AtomSymbol string = "ATOM" - AtomExponent = uint32(6) - USDDenom string = "USD" - BlocksPerMinute = uint64(10) - BlocksPerHour = BlocksPerMinute * 60 - BlocksPerDay = BlocksPerHour * 24 - BlocksPerWeek = BlocksPerDay * 7 - BlocksPerMonth = BlocksPerDay * 30 - BlocksPerYear = BlocksPerDay * 365 - MicroUnit = int64(1e6) -) - -type ( - // ExchangeRatePrevote defines a structure to store a validator's prevote on - // the rate of USD in the denom asset. - ExchangeRatePrevote struct { - Hash VoteHash `json:"hash"` // Vote hex hash to protect centralize data source problem - Denom string `json:"denom"` // Ticker symbol of denomination exchanged against USD - Voter sdk.ValAddress `json:"voter"` // Voter validator address - SubmitBlock int64 `json:"submit_block"` // Block height at submission - } - - // ExchangeRateVote defines a structure to store a validator's vote on the - // rate of USD in the denom asset. - ExchangeRateVote struct { - ExchangeRate sdk.Dec `json:"exchange_rate"` // Exchange rate of a denomination against USD - Denom string `json:"denom"` // Ticker symbol of denomination exchanged against USD - Voter sdk.ValAddress `json:"voter"` // Voter validator address - } - - // VoteHash defines a hash value to hide vote exchange rate which is formatted - // as a HEX string: - // SHA256("{salt}:{symbol}:{exchangeRate},...,{symbol}:{exchangeRate}:{voter}") - VoteHash []byte -) diff --git a/x/oracle/types/ballot.go b/x/oracle/types/ballot.go deleted file mode 100644 index ee5b8de88..000000000 --- a/x/oracle/types/ballot.go +++ /dev/null @@ -1,184 +0,0 @@ -package types - -import ( - "sort" - - sdk "github.com/cosmos/cosmos-sdk/types" -) - -// VoteForTally is a convenience wrapper to reduce redundant lookup cost. -type VoteForTally struct { - Denom string - ExchangeRate sdk.Dec - Voter sdk.ValAddress - Power int64 -} - -// NewVoteForTally returns a new VoteForTally instance. -func NewVoteForTally(rate sdk.Dec, denom string, voter sdk.ValAddress, power int64) VoteForTally { - return VoteForTally{ - ExchangeRate: rate, - Denom: denom, - Voter: voter, - Power: power, - } -} - -// ExchangeRateBallot is a convenience wrapper around a ExchangeRateVote slice. -type ExchangeRateBallot []VoteForTally - -// ToMap return organized exchange rate map by validator. -func (pb ExchangeRateBallot) ToMap() map[string]sdk.Dec { - exchangeRateMap := make(map[string]sdk.Dec) - for _, vote := range pb { - if vote.ExchangeRate.IsPositive() { - exchangeRateMap[vote.Voter.String()] = vote.ExchangeRate - } - } - - return exchangeRateMap -} - -// Power returns the total amount of voting power in the ballot. -func (pb ExchangeRateBallot) Power() int64 { - var totalPower int64 - for _, vote := range pb { - totalPower += vote.Power - } - - return totalPower -} - -// WeightedMedian returns the median weighted by the power of the ExchangeRateVote. -// CONTRACT: The ballot must be sorted. -func (pb ExchangeRateBallot) WeightedMedian() (sdk.Dec, error) { - if !sort.IsSorted(pb) { - return sdk.ZeroDec(), ErrBallotNotSorted - } - totalPower := pb.Power() - - if pb.Len() > 0 { - var pivot int64 - for _, v := range pb { - votePower := v.Power - - pivot += votePower - if pivot >= (totalPower / 2) { - return v.ExchangeRate, nil - } - } - } - - return sdk.ZeroDec(), nil -} - -// StandardDeviation returns the standard deviation by the power of the ExchangeRateVote. -func (pb ExchangeRateBallot) StandardDeviation() (sdk.Dec, error) { - if len(pb) == 0 { - return sdk.ZeroDec(), nil - } - - median, err := pb.WeightedMedian() - if err != nil { - return sdk.ZeroDec(), err - } - - sum := sdk.ZeroDec() - ballotLength := int64(len(pb)) - for _, v := range pb { - func() { - defer func() { - if e := recover(); e != nil { - ballotLength-- - } - }() - deviation := v.ExchangeRate.Sub(median) - sum = sum.Add(deviation.Mul(deviation)) - }() - } - - variance := sum.QuoInt64(ballotLength) - - standardDeviation, err := variance.ApproxSqrt() - if err != nil { - return sdk.ZeroDec(), err - } - - return standardDeviation, nil -} - -// Len implements sort.Interface -func (pb ExchangeRateBallot) Len() int { - return len(pb) -} - -// Less reports whether the element with -// index i should sort before the element with index j. -func (pb ExchangeRateBallot) Less(i, j int) bool { - return pb[i].ExchangeRate.LT(pb[j].ExchangeRate) -} - -// Swap implements sort.Interface. -func (pb ExchangeRateBallot) Swap(i, j int) { - pb[i], pb[j] = pb[j], pb[i] -} - -// BallotDenom is a convenience wrapper for setting rates deterministically. -type BallotDenom struct { - Ballot ExchangeRateBallot - Denom string -} - -// BallotMapToSlice returns an array of sorted exchange rate ballots. -func BallotMapToSlice(votes map[string]ExchangeRateBallot) []BallotDenom { - b := make([]BallotDenom, len(votes)) - i := 0 - for denom, ballot := range votes { - b[i] = BallotDenom{ - Denom: denom, - Ballot: ballot, - } - i++ - } - sort.Slice(b, func(i, j int) bool { - return b[i].Denom < b[j].Denom - }) - return b -} - -// Claim is an interface that directs its rewards to an attached bank account. -type Claim struct { - Power int64 - Weight int64 - WinCount int64 - Recipient sdk.ValAddress -} - -// NewClaim generates a Claim instance. -func NewClaim(power, weight, winCount int64, recipient sdk.ValAddress) Claim { - return Claim{ - Power: power, - Weight: weight, - WinCount: winCount, - Recipient: recipient, - } -} - -// ClaimMapToSlice returns an array of sorted exchange rate ballots. -func ClaimMapToSlice(claims map[string]Claim) []Claim { - c := make([]Claim, len(claims)) - i := 0 - for _, claim := range claims { - c[i] = Claim{ - Power: claim.Power, - Weight: claim.Weight, - WinCount: claim.WinCount, - Recipient: claim.Recipient, - } - i++ - } - sort.Slice(c, func(i, j int) bool { - return c[i].Recipient.String() < c[j].Recipient.String() - }) - return c -} diff --git a/x/oracle/types/ballot_test.go b/x/oracle/types/ballot_test.go deleted file mode 100644 index f1cdd2d25..000000000 --- a/x/oracle/types/ballot_test.go +++ /dev/null @@ -1,378 +0,0 @@ -package types - -import ( - "fmt" - "math" - "strconv" - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/crypto/secp256k1" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" -) - -func TestToMap(t *testing.T) { - tests := struct { - votes []VoteForTally - isValid []bool - }{ - []VoteForTally{ - { - Voter: sdk.ValAddress(secp256k1.GenPrivKey().PubKey().Address()), - Denom: JunoDenom, - ExchangeRate: sdk.NewDec(1600), - Power: 100, - }, - { - Voter: sdk.ValAddress(secp256k1.GenPrivKey().PubKey().Address()), - Denom: JunoDenom, - ExchangeRate: sdk.ZeroDec(), - Power: 100, - }, - { - Voter: sdk.ValAddress(secp256k1.GenPrivKey().PubKey().Address()), - Denom: JunoDenom, - ExchangeRate: sdk.NewDec(1500), - Power: 100, - }, - }, - []bool{true, false, true}, - } - - pb := ExchangeRateBallot(tests.votes) - mapData := pb.ToMap() - - for i, vote := range tests.votes { - exchangeRate, ok := mapData[vote.Voter.String()] - if tests.isValid[i] { - require.True(t, ok) - require.Equal(t, exchangeRate, vote.ExchangeRate) - } else { - require.False(t, ok) - } - } -} - -func TestSqrt(t *testing.T) { - num := sdk.NewDecWithPrec(144, 4) - floatNum, err := strconv.ParseFloat(num.String(), 64) - require.NoError(t, err) - - floatNum = math.Sqrt(floatNum) - num, err = sdk.NewDecFromStr(fmt.Sprintf("%f", floatNum)) - require.NoError(t, err) - - require.Equal(t, sdk.NewDecWithPrec(12, 2), num) -} - -func TestPBPower(t *testing.T) { - ctx := sdk.NewContext(nil, tmproto.Header{}, false, nil) - valAccAddrs, sk := GenerateRandomTestCase() - pb := ExchangeRateBallot{} - ballotPower := int64(0) - - for i := 0; i < len(sk.Validators()); i++ { - power := sk.Validator(ctx, valAccAddrs[i]).GetConsensusPower(sdk.DefaultPowerReduction) - vote := NewVoteForTally( - sdk.ZeroDec(), - JunoDenom, - valAccAddrs[i], - power, - ) - - pb = append(pb, vote) - require.NotEqual(t, int64(0), vote.Power) - - ballotPower += vote.Power - } - - require.Equal(t, ballotPower, pb.Power()) - - // Mix in a fake validator, the total power should not have changed. - pubKey := secp256k1.GenPrivKey().PubKey() - faceValAddr := sdk.ValAddress(pubKey.Address()) - fakeVote := NewVoteForTally( - sdk.OneDec(), - JunoDenom, - faceValAddr, - 0, - ) - - pb = append(pb, fakeVote) - require.Equal(t, ballotPower, pb.Power()) -} - -func TestPBWeightedMedian(t *testing.T) { - tests := []struct { - inputs []int64 - weights []int64 - isValidator []bool - median sdk.Dec - success bool - }{ - { - // Supermajority one number - []int64{1, 2, 10, 100000}, - []int64{1, 1, 100, 1}, - []bool{true, true, true, true}, - sdk.NewDec(10), - true, - }, - { - // Adding fake validator doesn't change outcome - []int64{1, 2, 10, 100000, 10000000000}, - []int64{1, 1, 100, 1, 10000}, - []bool{true, true, true, true, false}, - sdk.NewDec(10), - true, - }, - { - // Tie votes - []int64{1, 2, 3, 4}, - []int64{1, 100, 100, 1}, - []bool{true, true, true, true}, - sdk.NewDec(2), - true, - }, - { - // No votes - []int64{}, - []int64{}, - []bool{true, true, true, true}, - sdk.NewDec(0), - true, - }, - { - // Out of order - []int64{1, 2, 10, 3}, - []int64{1, 1, 100, 1}, - []bool{true, true, true, true}, - sdk.NewDec(10), - false, - }, - } - - for _, tc := range tests { - pb := ExchangeRateBallot{} - for i, input := range tc.inputs { - valAddr := sdk.ValAddress(secp256k1.GenPrivKey().PubKey().Address()) - - power := tc.weights[i] - if !tc.isValidator[i] { - power = 0 - } - - vote := NewVoteForTally( - sdk.NewDec(input), - JunoDenom, - valAddr, - power, - ) - - pb = append(pb, vote) - } - - median, err := pb.WeightedMedian() - if tc.success { - require.NoError(t, err) - require.Equal(t, tc.median, median) - } else { - require.Error(t, err) - } - - } -} - -func TestPBStandardDeviation(t *testing.T) { - tests := []struct { - inputs []sdk.Dec - weights []int64 - isValidator []bool - standardDeviation sdk.Dec - }{ - { - // Supermajority one number - []sdk.Dec{ - sdk.MustNewDecFromStr("1.0"), - sdk.MustNewDecFromStr("2.0"), - sdk.MustNewDecFromStr("10.0"), - sdk.MustNewDecFromStr("100000.00"), - }, - []int64{1, 1, 100, 1}, - []bool{true, true, true, true}, - sdk.MustNewDecFromStr("49995.000362536252310906"), - }, - { - // Adding fake validator doesn't change outcome - []sdk.Dec{ - sdk.MustNewDecFromStr("1.0"), - sdk.MustNewDecFromStr("2.0"), - sdk.MustNewDecFromStr("10.0"), - sdk.MustNewDecFromStr("100000.00"), - sdk.MustNewDecFromStr("10000000000"), - }, - []int64{1, 1, 100, 1, 10000}, - []bool{true, true, true, true, false}, - sdk.MustNewDecFromStr("4472135950.751005519905537611"), - }, - { - // Tie votes - []sdk.Dec{ - sdk.MustNewDecFromStr("1.0"), - sdk.MustNewDecFromStr("2.0"), - sdk.MustNewDecFromStr("3.0"), - sdk.MustNewDecFromStr("4.00"), - }, - []int64{1, 100, 100, 1}, - []bool{true, true, true, true}, - sdk.MustNewDecFromStr("1.224744871391589049"), - }, - { - // No votes - []sdk.Dec{}, - []int64{}, - []bool{true, true, true, true}, - sdk.NewDecWithPrec(0, 0), - }, - } - - for _, tc := range tests { - pb := ExchangeRateBallot{} - for i, input := range tc.inputs { - valAddr := sdk.ValAddress(secp256k1.GenPrivKey().PubKey().Address()) - - power := tc.weights[i] - if !tc.isValidator[i] { - power = 0 - } - - vote := NewVoteForTally( - input, - JunoDenom, - valAddr, - power, - ) - - pb = append(pb, vote) - } - stdDev, _ := pb.StandardDeviation() - - require.Equal(t, tc.standardDeviation, stdDev) - } -} - -func TestPBStandardDeviation_Overflow(t *testing.T) { - valAddr := sdk.ValAddress(secp256k1.GenPrivKey().PubKey().Address()) - overflowRate, err := sdk.NewDecFromStr("100000000000000000000000000000000000000000000000000000000.0") - require.NoError(t, err) - pb := ExchangeRateBallot{ - NewVoteForTally( - sdk.OneDec(), - JunoSymbol, - valAddr, - 2, - ), - NewVoteForTally( - sdk.NewDec(1234), - JunoSymbol, - valAddr, - 2, - ), - NewVoteForTally( - overflowRate, - JunoSymbol, - valAddr, - 1, - ), - } - - deviation, err := pb.StandardDeviation() - require.NoError(t, err) - expectedDevation := sdk.MustNewDecFromStr("871.862661203013097586") - require.Equal(t, expectedDevation, deviation) -} - -func TestBallotMapToSlice(t *testing.T) { - valAddress := GenerateRandomValAddr(1) - - pb := ExchangeRateBallot{ - NewVoteForTally( - sdk.NewDec(1234), - JunoSymbol, - valAddress[0], - 2, - ), - NewVoteForTally( - sdk.NewDec(12345), - JunoSymbol, - valAddress[0], - 1, - ), - } - - ballotSlice := BallotMapToSlice(map[string]ExchangeRateBallot{ - JunoDenom: pb, - IbcDenomAtom: pb, - }) - require.Equal(t, []BallotDenom{{Ballot: pb, Denom: IbcDenomAtom}, {Ballot: pb, Denom: JunoDenom}}, ballotSlice) -} - -func TestExchangeRateBallotSwap(t *testing.T) { - valAddress := GenerateRandomValAddr(2) - - voteTallies := []VoteForTally{ - NewVoteForTally( - sdk.NewDec(1234), - JunoSymbol, - valAddress[0], - 2, - ), - NewVoteForTally( - sdk.NewDec(12345), - JunoSymbol, - valAddress[1], - 1, - ), - } - - pb := ExchangeRateBallot{voteTallies[0], voteTallies[1]} - - require.Equal(t, pb[0], voteTallies[0]) - require.Equal(t, pb[1], voteTallies[1]) - pb.Swap(1, 0) - require.Equal(t, pb[1], voteTallies[0]) - require.Equal(t, pb[0], voteTallies[1]) -} - -func TestStandardDeviationUnsorted(t *testing.T) { - valAddress := GenerateRandomValAddr(1) - pb := ExchangeRateBallot{ - NewVoteForTally( - sdk.NewDec(1234), - JunoSymbol, - valAddress[0], - 2, - ), - NewVoteForTally( - sdk.NewDec(12), - JunoSymbol, - valAddress[0], - 1, - ), - } - - deviation, err := pb.StandardDeviation() - require.ErrorIs(t, err, ErrBallotNotSorted) - require.Equal(t, "0.000000000000000000", deviation.String()) -} - -func TestClaimMapToSlice(t *testing.T) { - valAddress := GenerateRandomValAddr(1) - claim := NewClaim(10, 1, 4, valAddress[0]) - claimSlice := ClaimMapToSlice(map[string]Claim{ - "testClaim": claim, - "anotherClaim": claim, - }) - require.Equal(t, []Claim{claim, claim}, claimSlice) -} diff --git a/x/oracle/types/codec.go b/x/oracle/types/codec.go deleted file mode 100644 index 7f6e56d3f..000000000 --- a/x/oracle/types/codec.go +++ /dev/null @@ -1,59 +0,0 @@ -package types - -import ( - "github.com/cosmos/cosmos-sdk/codec" - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/msgservice" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" -) - -var ( - amino = codec.NewLegacyAmino() - - // ModuleCdc references the global x/oracle module codec. Note, the codec should - // ONLY be used in certain instances of tests and for JSON encoding as Amino is - // still used for that purpose. - // - // The actual codec used for serialization should be provided to x/staking and - // defined at the application level. - ModuleCdc = codec.NewAminoCodec(amino) -) - -func init() { - RegisterLegacyAminoCodec(amino) - cryptocodec.RegisterCrypto(amino) - amino.Seal() -} - -// RegisterLegacyAminoCodec registers the necessary x/oracle interfaces and concrete types -// on the provided LegacyAmino codec. These types are used for Amino JSON serialization. -func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { - cdc.RegisterConcrete(&MsgAggregateExchangeRatePrevote{}, "juno/oracle/MsgAggregateExchangeRatePrevote", nil) - cdc.RegisterConcrete(&MsgAggregateExchangeRateVote{}, "juno/oracle/MsgAggregateExchangeRateVote", nil) - cdc.RegisterConcrete(&MsgDelegateFeedConsent{}, "juno/oracle/MsgDelegateFeedConsent", nil) - - cdc.RegisterConcrete(&AddTrackingPriceHistoryProposal{}, "juno/oracle/AddTrackingPriceHistoryProposal", nil) - cdc.RegisterConcrete(&AddTrackingPriceHistoryWithWhitelistProposal{}, "juno/oracle/AddTrackingPriceHistoryWithWhitelistProposal", nil) - cdc.RegisterConcrete(&RemoveTrackingPriceHistoryProposal{}, "juno/oracle/RemoveTrackingPriceHistoryProposal", nil) -} - -// RegisterInterfaces registers the x/oracle interfaces types with the interface registry -func RegisterInterfaces(registry codectypes.InterfaceRegistry) { - registry.RegisterImplementations( - (*sdk.Msg)(nil), - &MsgDelegateFeedConsent{}, - &MsgAggregateExchangeRatePrevote{}, - &MsgAggregateExchangeRateVote{}, - ) - - registry.RegisterImplementations( - (*govtypes.Content)(nil), - &AddTrackingPriceHistoryProposal{}, - &AddTrackingPriceHistoryWithWhitelistProposal{}, - &RemoveTrackingPriceHistoryProposal{}, - ) - - msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) -} diff --git a/x/oracle/types/codec_test.go b/x/oracle/types/codec_test.go deleted file mode 100644 index 503de0ba3..000000000 --- a/x/oracle/types/codec_test.go +++ /dev/null @@ -1,14 +0,0 @@ -package types - -import ( - "testing" - - "github.com/cosmos/cosmos-sdk/codec/types" - "github.com/stretchr/testify/require" -) - -func TestRegisterInterfaces(t *testing.T) { - registry := types.NewInterfaceRegistry() - RegisterInterfaces(registry) - require.Equal(t, registry.ListAllInterfaces(), []string{}) -} diff --git a/x/oracle/types/denom.go b/x/oracle/types/denom.go deleted file mode 100644 index b3135f890..000000000 --- a/x/oracle/types/denom.go +++ /dev/null @@ -1,42 +0,0 @@ -package types - -import ( - "strings" - - "gopkg.in/yaml.v3" -) - -// String implements fmt.Stringer interface -func (d Denom) String() string { - out, _ := yaml.Marshal(d) - return string(out) -} - -// Equal implements equal interface -func (d Denom) Equal(d1 *Denom) bool { - return d.BaseDenom == d1.BaseDenom && - d.SymbolDenom == d1.SymbolDenom && - d.Exponent == d1.Exponent -} - -// DenomList is array of Denom -type DenomList []Denom - -// String implements fmt.Stringer interface -func (dl DenomList) String() (out string) { - for _, d := range dl { - out += d.String() + "\n" - } - - return strings.TrimSpace(out) -} - -// Contains checks whether or not a SymbolDenom (e.g. JUNO) is in the DenomList -func (dl DenomList) Contains(symbolDenom string) bool { - for _, d := range dl { - if strings.EqualFold(d.SymbolDenom, symbolDenom) { - return true - } - } - return false -} diff --git a/x/oracle/types/denom_test.go b/x/oracle/types/denom_test.go deleted file mode 100644 index fed4b7275..000000000 --- a/x/oracle/types/denom_test.go +++ /dev/null @@ -1,128 +0,0 @@ -package types_test - -import ( - "testing" - - "github.com/CosmosContracts/juno/v13/x/oracle/types" - "github.com/stretchr/testify/require" -) - -func TestDenomString(t *testing.T) { - testCases := []struct { - denom types.Denom - expectedStr string - }{ - { - denom: types.DenomJuno, - expectedStr: "base_denom: ujuno\nsymbol_denom: JUNO\nexponent: 6\n", - }, - { - denom: types.DenomLuna, - expectedStr: "base_denom: ibc/0EF15DF2F02480ADE0BB6E85D9EBB5DAEA2836D3860E9F97F9AADE4F57A31AA0\nsymbol_denom: LUNA\nexponent: 6\n", - }, - { - denom: types.DenomAtom, - expectedStr: "base_denom: ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2\nsymbol_denom: ATOM\nexponent: 6\n", - }, - } - - for _, testCase := range testCases { - require.Equal(t, testCase.expectedStr, testCase.denom.String()) - } -} - -func TestDenomEqual(t *testing.T) { - testCases := []struct { - denom types.Denom - denomCompared types.Denom - equal bool - }{ - { - denom: types.DenomJuno, - denomCompared: types.DenomJuno, - equal: true, - }, - { - denom: types.DenomJuno, - denomCompared: types.DenomLuna, - equal: false, - }, - { - denom: types.DenomLuna, - denomCompared: types.DenomLuna, - equal: true, - }, - { - denom: types.DenomAtom, - denomCompared: types.DenomAtom, - equal: true, - }, - { - denom: types.DenomAtom, - denomCompared: types.DenomLuna, - equal: false, - }, - } - - for _, testCase := range testCases { - require.Equal(t, testCase.equal, testCase.denom.Equal(&testCase.denomCompared)) - } -} - -func TestDenomListString(t *testing.T) { - testCases := []struct { - denomList types.DenomList - expectedStr string - }{ - { - denomList: types.DenomList{types.DenomJuno}, - expectedStr: "base_denom: ujuno\nsymbol_denom: JUNO\nexponent: 6", - }, - { - denomList: types.DenomList{types.DenomAtom, types.DenomLuna}, - expectedStr: "base_denom: ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2\nsymbol_denom: ATOM\nexponent: 6\n\nbase_denom: ibc/0EF15DF2F02480ADE0BB6E85D9EBB5DAEA2836D3860E9F97F9AADE4F57A31AA0\nsymbol_denom: LUNA\nexponent: 6", - }, - } - - for _, testCase := range testCases { - require.Equal(t, testCase.expectedStr, testCase.denomList.String()) - } -} - -func TestDenomListContains(t *testing.T) { - testCases := []struct { - denomList types.DenomList - denomSymbol string - symbolInList bool - }{ - { - denomList: types.DenomList{types.DenomJuno}, - denomSymbol: types.DenomJuno.SymbolDenom, - symbolInList: true, - }, - { - denomList: types.DenomList{types.DenomJuno}, - denomSymbol: types.DenomLuna.SymbolDenom, - symbolInList: false, - }, - { - denomList: types.DenomList{types.DenomJuno, types.DenomAtom}, - denomSymbol: types.DenomLuna.SymbolDenom, - symbolInList: false, - }, - { - denomList: types.DenomList{types.DenomJuno, types.DenomAtom}, - denomSymbol: types.DenomAtom.SymbolDenom, - symbolInList: true, - }, - { - denomList: types.DenomList{types.DenomJuno, types.DenomAtom, types.DenomLuna}, - denomSymbol: types.DenomLuna.SymbolDenom, - symbolInList: true, - }, - } - - for _, testCase := range testCases { - require.Equal(t, testCase.symbolInList, testCase.denomList.Contains(testCase.denomSymbol)) - } -} diff --git a/x/oracle/types/errors.go b/x/oracle/types/errors.go deleted file mode 100644 index 3a3b75c6c..000000000 --- a/x/oracle/types/errors.go +++ /dev/null @@ -1,33 +0,0 @@ -package types - -import ( - "fmt" - - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/tendermint/tendermint/crypto/tmhash" -) - -// Oracle sentinel errors -var ( - ErrInvalidExchangeRate = sdkerrors.Register(ModuleName, 1, "invalid exchange rate") - ErrNoPrevote = sdkerrors.Register(ModuleName, 2, "no prevote") - ErrNoVote = sdkerrors.Register(ModuleName, 3, "no vote") - ErrNoVotingPermission = sdkerrors.Register(ModuleName, 4, "unauthorized voter") - ErrInvalidHash = sdkerrors.Register(ModuleName, 5, "invalid hash") - ErrInvalidHashLength = sdkerrors.Register(ModuleName, 6, fmt.Sprintf("invalid hash length; should equal %d", tmhash.TruncatedSize)) //nolint: lll - ErrVerificationFailed = sdkerrors.Register(ModuleName, 7, "hash verification failed") - ErrRevealPeriodMissMatch = sdkerrors.Register(ModuleName, 8, "reveal period of submitted vote does not match with registered prevote") //nolint: lll - ErrInvalidSaltLength = sdkerrors.Register(ModuleName, 9, "invalid salt length; must be 64") - ErrInvalidSaltFormat = sdkerrors.Register(ModuleName, 10, "invalid salt format") - ErrNoAggregatePrevote = sdkerrors.Register(ModuleName, 11, "no aggregate prevote") - ErrNoAggregateVote = sdkerrors.Register(ModuleName, 12, "no aggregate vote") - ErrUnknownDenom = sdkerrors.Register(ModuleName, 13, "unknown denom") - ErrNegativeOrZeroRate = sdkerrors.Register(ModuleName, 14, "invalid exchange rate; should be positive") - ErrExistingPrevote = sdkerrors.Register(ModuleName, 15, "prevote already submitted for this voting period") - ErrBallotNotSorted = sdkerrors.Register(ModuleName, 16, "ballot must be sorted before this operation") - ErrInvalidVotePeriod = sdkerrors.Register(ModuleName, 17, "invalid voting period") - ErrEmpty = sdkerrors.Register(ModuleName, 18, "empty") - - // 4XX = Price Sensitive - ErrInvalidOraclePrice = sdkerrors.Register(ModuleName, 401, "invalid oracle price") -) diff --git a/x/oracle/types/events.pb.go b/x/oracle/types/events.pb.go deleted file mode 100644 index 5b96e459a..000000000 --- a/x/oracle/types/events.pb.go +++ /dev/null @@ -1,580 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: juno/oracle/v1/events.proto - -package types - -import ( - fmt "fmt" - _ "github.com/cosmos/cosmos-proto" - github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/gogo/protobuf/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// EventDelegateFeedConsent is emitted on Msg/DelegateFeedConsent -type EventDelegateFeedConsent struct { - // Operator bech32 address who delegates his feed consent - Operator string `protobuf:"bytes,1,opt,name=operator,proto3" json:"operator,omitempty"` - // Delegate bech32 address - Delegate string `protobuf:"bytes,2,opt,name=delegate,proto3" json:"delegate,omitempty"` -} - -func (m *EventDelegateFeedConsent) Reset() { *m = EventDelegateFeedConsent{} } -func (m *EventDelegateFeedConsent) String() string { return proto.CompactTextString(m) } -func (*EventDelegateFeedConsent) ProtoMessage() {} -func (*EventDelegateFeedConsent) Descriptor() ([]byte, []int) { - return fileDescriptor_2af2611ef98e6d54, []int{0} -} -func (m *EventDelegateFeedConsent) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EventDelegateFeedConsent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EventDelegateFeedConsent.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *EventDelegateFeedConsent) XXX_Merge(src proto.Message) { - xxx_messageInfo_EventDelegateFeedConsent.Merge(m, src) -} -func (m *EventDelegateFeedConsent) XXX_Size() int { - return m.Size() -} -func (m *EventDelegateFeedConsent) XXX_DiscardUnknown() { - xxx_messageInfo_EventDelegateFeedConsent.DiscardUnknown(m) -} - -var xxx_messageInfo_EventDelegateFeedConsent proto.InternalMessageInfo - -// EventSetFxRate is emitted on exchange rate update -type EventSetFxRate struct { - // uToken denom - Denom string `protobuf:"bytes,1,opt,name=denom,proto3" json:"denom,omitempty"` - // Exchange rate (based to USD) - Rate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=rate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"rate"` -} - -func (m *EventSetFxRate) Reset() { *m = EventSetFxRate{} } -func (m *EventSetFxRate) String() string { return proto.CompactTextString(m) } -func (*EventSetFxRate) ProtoMessage() {} -func (*EventSetFxRate) Descriptor() ([]byte, []int) { - return fileDescriptor_2af2611ef98e6d54, []int{1} -} -func (m *EventSetFxRate) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EventSetFxRate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EventSetFxRate.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *EventSetFxRate) XXX_Merge(src proto.Message) { - xxx_messageInfo_EventSetFxRate.Merge(m, src) -} -func (m *EventSetFxRate) XXX_Size() int { - return m.Size() -} -func (m *EventSetFxRate) XXX_DiscardUnknown() { - xxx_messageInfo_EventSetFxRate.DiscardUnknown(m) -} - -var xxx_messageInfo_EventSetFxRate proto.InternalMessageInfo - -func init() { - proto.RegisterType((*EventDelegateFeedConsent)(nil), "juno.oracle.v1.EventDelegateFeedConsent") - proto.RegisterType((*EventSetFxRate)(nil), "juno.oracle.v1.EventSetFxRate") -} - -func init() { proto.RegisterFile("juno/oracle/v1/events.proto", fileDescriptor_2af2611ef98e6d54) } - -var fileDescriptor_2af2611ef98e6d54 = []byte{ - // 317 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0xb1, 0x4e, 0x32, 0x41, - 0x10, 0xc7, 0xef, 0xbe, 0x7c, 0x1a, 0xdd, 0x82, 0xe2, 0x42, 0x71, 0x62, 0xb2, 0x18, 0x0a, 0x63, - 0xc3, 0x5d, 0x88, 0x96, 0x36, 0x02, 0x52, 0x59, 0x98, 0xa3, 0xb3, 0x31, 0xc7, 0xee, 0xe4, 0x44, - 0x61, 0x87, 0xec, 0x0e, 0x04, 0x5f, 0xc0, 0xda, 0x87, 0xe1, 0x21, 0x28, 0x09, 0x95, 0xb1, 0x20, - 0xca, 0xbd, 0x88, 0xb9, 0xdd, 0x43, 0xed, 0xac, 0x76, 0x67, 0xe6, 0xff, 0xff, 0xcd, 0xec, 0x0e, - 0x3b, 0x7e, 0x9c, 0x2a, 0x8c, 0x51, 0xa7, 0x62, 0x04, 0xf1, 0xac, 0x15, 0xc3, 0x0c, 0x14, 0x99, - 0x68, 0xa2, 0x91, 0x30, 0xa8, 0x14, 0xc5, 0xc8, 0x15, 0xa3, 0x59, 0xab, 0x76, 0x24, 0xd0, 0x8c, - 0xd1, 0xdc, 0xdb, 0x6a, 0xec, 0x02, 0x27, 0xad, 0x55, 0x33, 0xcc, 0xd0, 0xe5, 0x8b, 0x9b, 0xcb, - 0x36, 0x5e, 0x7c, 0x16, 0x5e, 0x17, 0xc4, 0x2e, 0x8c, 0x20, 0x4b, 0x09, 0x7a, 0x00, 0xb2, 0x83, - 0xca, 0x80, 0xa2, 0xe0, 0x82, 0x1d, 0xe0, 0x04, 0x74, 0x4a, 0xa8, 0x43, 0xff, 0xc4, 0x3f, 0x3b, - 0x6c, 0x87, 0xeb, 0x45, 0xb3, 0x5a, 0x62, 0xaf, 0xa4, 0xd4, 0x60, 0x4c, 0x9f, 0xf4, 0x50, 0x65, - 0xc9, 0xb7, 0xb2, 0x70, 0xc9, 0x12, 0x16, 0xfe, 0xfb, 0xcb, 0xb5, 0x53, 0x36, 0xe6, 0xac, 0x62, - 0xe7, 0xe8, 0x03, 0xf5, 0xe6, 0x49, 0x4a, 0x10, 0x54, 0xd9, 0x9e, 0x04, 0x85, 0x63, 0xd7, 0x3a, - 0x71, 0x41, 0x70, 0xcb, 0xfe, 0xeb, 0x1f, 0xf2, 0xe5, 0x72, 0x53, 0xf7, 0xde, 0x37, 0xf5, 0xd3, - 0x6c, 0x48, 0x0f, 0xd3, 0x41, 0x24, 0x70, 0x5c, 0xbe, 0xba, 0x3c, 0x9a, 0x46, 0x3e, 0xc5, 0xf4, - 0x3c, 0x01, 0x13, 0x75, 0x41, 0xac, 0x17, 0x4d, 0x56, 0xce, 0xd1, 0x05, 0x91, 0x58, 0x52, 0xfb, - 0x66, 0xf9, 0xc9, 0xbd, 0xe5, 0x96, 0xfb, 0xab, 0x2d, 0xf7, 0x3f, 0xb6, 0xdc, 0x7f, 0xcd, 0xb9, - 0xb7, 0xca, 0xb9, 0xf7, 0x96, 0x73, 0xef, 0x2e, 0xfa, 0x45, 0xee, 0x58, 0x6b, 0x07, 0x15, 0xe9, - 0x54, 0x90, 0x89, 0xed, 0x66, 0xe6, 0xbb, 0xdd, 0xd8, 0x2e, 0x83, 0x7d, 0xfb, 0xaf, 0xe7, 0x5f, - 0x01, 0x00, 0x00, 0xff, 0xff, 0x2c, 0xd5, 0x83, 0x79, 0xb7, 0x01, 0x00, 0x00, -} - -func (m *EventDelegateFeedConsent) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EventDelegateFeedConsent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EventDelegateFeedConsent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Delegate) > 0 { - i -= len(m.Delegate) - copy(dAtA[i:], m.Delegate) - i = encodeVarintEvents(dAtA, i, uint64(len(m.Delegate))) - i-- - dAtA[i] = 0x12 - } - if len(m.Operator) > 0 { - i -= len(m.Operator) - copy(dAtA[i:], m.Operator) - i = encodeVarintEvents(dAtA, i, uint64(len(m.Operator))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *EventSetFxRate) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EventSetFxRate) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EventSetFxRate) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.Rate.Size() - i -= size - if _, err := m.Rate.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if len(m.Denom) > 0 { - i -= len(m.Denom) - copy(dAtA[i:], m.Denom) - i = encodeVarintEvents(dAtA, i, uint64(len(m.Denom))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintEvents(dAtA []byte, offset int, v uint64) int { - offset -= sovEvents(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *EventDelegateFeedConsent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Operator) - if l > 0 { - n += 1 + l + sovEvents(uint64(l)) - } - l = len(m.Delegate) - if l > 0 { - n += 1 + l + sovEvents(uint64(l)) - } - return n -} - -func (m *EventSetFxRate) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Denom) - if l > 0 { - n += 1 + l + sovEvents(uint64(l)) - } - l = m.Rate.Size() - n += 1 + l + sovEvents(uint64(l)) - return n -} - -func sovEvents(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozEvents(x uint64) (n int) { - return sovEvents(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *EventDelegateFeedConsent) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: EventDelegateFeedConsent: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EventDelegateFeedConsent: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Operator", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Operator = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Delegate", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Delegate = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EventSetFxRate) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: EventSetFxRate: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EventSetFxRate: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Denom", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Denom = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Rate", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Rate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipEvents(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowEvents - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowEvents - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowEvents - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthEvents - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupEvents - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthEvents - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthEvents = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowEvents = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupEvents = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/oracle/types/expected_keeper.go b/x/oracle/types/expected_keeper.go deleted file mode 100644 index a2af8a0b2..000000000 --- a/x/oracle/types/expected_keeper.go +++ /dev/null @@ -1,48 +0,0 @@ -package types - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" -) - -// StakingKeeper defines the expected interface contract defined by the x/staking -// module. -type StakingKeeper interface { - Validator(ctx sdk.Context, address sdk.ValAddress) stakingtypes.ValidatorI - GetBondedValidatorsByPower(ctx sdk.Context) []stakingtypes.Validator - TotalBondedTokens(sdk.Context) sdk.Int - Slash(sdk.Context, sdk.ConsAddress, int64, int64, sdk.Dec) - Jail(sdk.Context, sdk.ConsAddress) - ValidatorsPowerStoreIterator(ctx sdk.Context) sdk.Iterator - MaxValidators(sdk.Context) uint32 - PowerReduction(ctx sdk.Context) (res sdk.Int) -} - -// DistributionKeeper defines the expected interface contract defined by the -// x/distribution module. -type DistributionKeeper interface { - AllocateTokensToValidator(ctx sdk.Context, val stakingtypes.ValidatorI, tokens sdk.DecCoins) - GetValidatorOutstandingRewardsCoins(ctx sdk.Context, val sdk.ValAddress) sdk.DecCoins -} - -// AccountKeeper defines the expected interface contract defined by the x/auth -// module. -type AccountKeeper interface { - GetModuleAddress(name string) sdk.AccAddress - GetModuleAccount(ctx sdk.Context, moduleName string) authtypes.ModuleAccountI - - // only used for simulation - GetAccount(ctx sdk.Context, addr sdk.AccAddress) authtypes.AccountI -} - -// BankKeeper defines the expected interface contract defined by the x/bank -// module. -type BankKeeper interface { - GetBalance(ctx sdk.Context, addr sdk.AccAddress, denom string) sdk.Coin - GetAllBalances(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins - SendCoinsFromModuleToModule(ctx sdk.Context, senderModule, recipientModule string, amt sdk.Coins) error - GetDenomMetaData(ctx sdk.Context, denom string) (banktypes.Metadata, bool) - SetDenomMetaData(ctx sdk.Context, denomMetaData banktypes.Metadata) -} diff --git a/x/oracle/types/genesis.go b/x/oracle/types/genesis.go deleted file mode 100644 index dc403142d..000000000 --- a/x/oracle/types/genesis.go +++ /dev/null @@ -1,59 +0,0 @@ -package types - -import ( - "encoding/json" - - "github.com/cosmos/cosmos-sdk/codec" -) - -// NewGenesisState creates a new GenesisState object -func NewGenesisState( - params Params, - rates []ExchangeRateTuple, - feederDelegations []FeederDelegation, - missCounters []MissCounter, - aggregateExchangeRatePrevotes []AggregateExchangeRatePrevote, - aggregateExchangeRateVotes []AggregateExchangeRateVote, - priceHistory []PriceHistory, -) *GenesisState { - return &GenesisState{ - Params: params, - ExchangeRates: rates, - FeederDelegations: feederDelegations, - MissCounters: missCounters, - AggregateExchangeRatePrevotes: aggregateExchangeRatePrevotes, - AggregateExchangeRateVotes: aggregateExchangeRateVotes, - PriceHistory: priceHistory, - } -} - -// DefaultGenesisState returns the default genesesis state for the x/oracle -// module. -func DefaultGenesisState() *GenesisState { - return &GenesisState{ - Params: DefaultParams(), - ExchangeRates: []ExchangeRateTuple{}, - FeederDelegations: []FeederDelegation{}, - MissCounters: []MissCounter{}, - AggregateExchangeRatePrevotes: []AggregateExchangeRatePrevote{}, - AggregateExchangeRateVotes: []AggregateExchangeRateVote{}, - PriceHistory: []PriceHistory{}, - } -} - -// ValidateGenesis validates the oracle genesis state. -func ValidateGenesis(data *GenesisState) error { - return data.Params.Validate() -} - -// GetGenesisStateFromAppState returns x/oracle GenesisState given raw application -// genesis state. -func GetGenesisStateFromAppState(cdc codec.JSONCodec, appState map[string]json.RawMessage) *GenesisState { - var genesisState GenesisState - - if appState[ModuleName] != nil { - cdc.MustUnmarshalJSON(appState[ModuleName], &genesisState) - } - - return &genesisState -} diff --git a/x/oracle/types/genesis.pb.go b/x/oracle/types/genesis.pb.go deleted file mode 100644 index 35d554f64..000000000 --- a/x/oracle/types/genesis.pb.go +++ /dev/null @@ -1,1066 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: juno/oracle/v1/genesis.proto - -package types - -import ( - fmt "fmt" - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/gogo/protobuf/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// GenesisState defines the oracle module's genesis state. -type GenesisState struct { - Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` - FeederDelegations []FeederDelegation `protobuf:"bytes,2,rep,name=feeder_delegations,json=feederDelegations,proto3" json:"feeder_delegations"` - ExchangeRates ExchangeRateTuples `protobuf:"bytes,3,rep,name=exchange_rates,json=exchangeRates,proto3,castrepeated=ExchangeRateTuples" json:"exchange_rates"` - MissCounters []MissCounter `protobuf:"bytes,4,rep,name=miss_counters,json=missCounters,proto3" json:"miss_counters"` - AggregateExchangeRatePrevotes []AggregateExchangeRatePrevote `protobuf:"bytes,5,rep,name=aggregate_exchange_rate_prevotes,json=aggregateExchangeRatePrevotes,proto3" json:"aggregate_exchange_rate_prevotes"` - AggregateExchangeRateVotes []AggregateExchangeRateVote `protobuf:"bytes,6,rep,name=aggregate_exchange_rate_votes,json=aggregateExchangeRateVotes,proto3" json:"aggregate_exchange_rate_votes"` - PriceHistory []PriceHistory `protobuf:"bytes,7,rep,name=price_history,json=priceHistory,proto3" json:"price_history"` -} - -func (m *GenesisState) Reset() { *m = GenesisState{} } -func (m *GenesisState) String() string { return proto.CompactTextString(m) } -func (*GenesisState) ProtoMessage() {} -func (*GenesisState) Descriptor() ([]byte, []int) { - return fileDescriptor_56956c37e013837f, []int{0} -} -func (m *GenesisState) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GenesisState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GenesisState.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *GenesisState) XXX_Merge(src proto.Message) { - xxx_messageInfo_GenesisState.Merge(m, src) -} -func (m *GenesisState) XXX_Size() int { - return m.Size() -} -func (m *GenesisState) XXX_DiscardUnknown() { - xxx_messageInfo_GenesisState.DiscardUnknown(m) -} - -var xxx_messageInfo_GenesisState proto.InternalMessageInfo - -// FeederDelegation is the address for where oracle feeder authority are -// delegated to. By default this struct is only used at genesis to feed in -// default feeder addresses. -type FeederDelegation struct { - FeederAddress string `protobuf:"bytes,1,opt,name=feeder_address,json=feederAddress,proto3" json:"feeder_address,omitempty"` - ValidatorAddress string `protobuf:"bytes,2,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty"` -} - -func (m *FeederDelegation) Reset() { *m = FeederDelegation{} } -func (m *FeederDelegation) String() string { return proto.CompactTextString(m) } -func (*FeederDelegation) ProtoMessage() {} -func (*FeederDelegation) Descriptor() ([]byte, []int) { - return fileDescriptor_56956c37e013837f, []int{1} -} -func (m *FeederDelegation) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *FeederDelegation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_FeederDelegation.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *FeederDelegation) XXX_Merge(src proto.Message) { - xxx_messageInfo_FeederDelegation.Merge(m, src) -} -func (m *FeederDelegation) XXX_Size() int { - return m.Size() -} -func (m *FeederDelegation) XXX_DiscardUnknown() { - xxx_messageInfo_FeederDelegation.DiscardUnknown(m) -} - -var xxx_messageInfo_FeederDelegation proto.InternalMessageInfo - -// MissCounter defines an miss counter and validator address pair used in -// oracle module's genesis state -type MissCounter struct { - ValidatorAddress string `protobuf:"bytes,1,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty"` - MissCounter uint64 `protobuf:"varint,2,opt,name=miss_counter,json=missCounter,proto3" json:"miss_counter,omitempty"` -} - -func (m *MissCounter) Reset() { *m = MissCounter{} } -func (m *MissCounter) String() string { return proto.CompactTextString(m) } -func (*MissCounter) ProtoMessage() {} -func (*MissCounter) Descriptor() ([]byte, []int) { - return fileDescriptor_56956c37e013837f, []int{2} -} -func (m *MissCounter) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MissCounter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MissCounter.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MissCounter) XXX_Merge(src proto.Message) { - xxx_messageInfo_MissCounter.Merge(m, src) -} -func (m *MissCounter) XXX_Size() int { - return m.Size() -} -func (m *MissCounter) XXX_DiscardUnknown() { - xxx_messageInfo_MissCounter.DiscardUnknown(m) -} - -var xxx_messageInfo_MissCounter proto.InternalMessageInfo - -func init() { - proto.RegisterType((*GenesisState)(nil), "juno.oracle.v1.GenesisState") - proto.RegisterType((*FeederDelegation)(nil), "juno.oracle.v1.FeederDelegation") - proto.RegisterType((*MissCounter)(nil), "juno.oracle.v1.MissCounter") -} - -func init() { proto.RegisterFile("juno/oracle/v1/genesis.proto", fileDescriptor_56956c37e013837f) } - -var fileDescriptor_56956c37e013837f = []byte{ - // 503 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0xcb, 0x6e, 0xd3, 0x40, - 0x14, 0x86, 0xed, 0x5e, 0x82, 0x98, 0x5c, 0xd4, 0x8e, 0x10, 0xb2, 0xd2, 0xd6, 0x4d, 0x23, 0x21, - 0x15, 0x81, 0x6c, 0xb5, 0xf0, 0x02, 0x4d, 0xa0, 0x65, 0x01, 0x52, 0x65, 0x2e, 0x0b, 0x24, 0x64, - 0x4d, 0xed, 0x13, 0xc7, 0x28, 0xf6, 0x58, 0x73, 0x26, 0x51, 0x2b, 0x96, 0xbc, 0x00, 0xcf, 0xc1, - 0x93, 0x64, 0xd9, 0x25, 0x2b, 0x2e, 0xc9, 0x8b, 0x20, 0xcf, 0x38, 0x8d, 0xeb, 0xb6, 0x88, 0x5d, - 0x74, 0xfe, 0xef, 0xfc, 0xff, 0x51, 0xfc, 0x0f, 0xd9, 0xfe, 0x3c, 0x4e, 0xb9, 0xcb, 0x05, 0x0b, - 0x46, 0xe0, 0x4e, 0x0e, 0xdc, 0x08, 0x52, 0xc0, 0x18, 0x9d, 0x4c, 0x70, 0xc9, 0x69, 0x2b, 0x57, - 0x1d, 0xad, 0x3a, 0x93, 0x83, 0xf6, 0x83, 0x88, 0x47, 0x5c, 0x49, 0x6e, 0xfe, 0x4b, 0x53, 0xed, - 0xad, 0x8a, 0x47, 0xc1, 0x2b, 0xb1, 0xfb, 0x75, 0x9d, 0x34, 0x4e, 0xb4, 0xe9, 0x5b, 0xc9, 0x24, - 0xd0, 0xe7, 0xa4, 0x96, 0x31, 0xc1, 0x12, 0xb4, 0xcc, 0x8e, 0xb9, 0x5f, 0x3f, 0x7c, 0xe8, 0x5c, - 0x0f, 0x71, 0x4e, 0x95, 0xda, 0x5b, 0x9b, 0xfe, 0xdc, 0x35, 0xbc, 0x82, 0xa5, 0xef, 0x09, 0x1d, - 0x00, 0x84, 0x20, 0xfc, 0x10, 0x46, 0x10, 0x31, 0x19, 0xf3, 0x14, 0xad, 0x95, 0xce, 0xea, 0x7e, - 0xfd, 0xb0, 0x53, 0x75, 0x38, 0x56, 0xe4, 0x8b, 0x2b, 0xb0, 0xf0, 0xda, 0x1c, 0x54, 0xe6, 0x48, - 0x43, 0xd2, 0x82, 0xf3, 0x60, 0xc8, 0xd2, 0x08, 0x7c, 0xc1, 0x24, 0xa0, 0xb5, 0xaa, 0x2c, 0xf7, - 0xaa, 0x96, 0x2f, 0x0b, 0xca, 0x63, 0x12, 0xde, 0x8d, 0xb3, 0x11, 0xf4, 0xda, 0xb9, 0xe7, 0xf7, - 0x5f, 0xbb, 0xf4, 0x86, 0x84, 0x5e, 0x13, 0x4a, 0x33, 0xa4, 0xc7, 0xa4, 0x99, 0xc4, 0x88, 0x7e, - 0xc0, 0xc7, 0xa9, 0x04, 0x81, 0xd6, 0x9a, 0x0a, 0xd9, 0xaa, 0x86, 0xbc, 0x89, 0x11, 0xfb, 0x9a, - 0x29, 0x4e, 0x6e, 0x24, 0xcb, 0x11, 0xd2, 0x2f, 0xa4, 0xc3, 0xa2, 0x48, 0xe4, 0xd7, 0x83, 0x7f, - 0xed, 0x6e, 0x3f, 0x13, 0x30, 0xe1, 0xf9, 0xfd, 0xeb, 0xca, 0xfa, 0x69, 0xd5, 0xfa, 0x68, 0xb1, - 0x57, 0xbe, 0xf6, 0x54, 0x2f, 0x15, 0x59, 0x3b, 0xec, 0x1f, 0x0c, 0x52, 0x41, 0x76, 0xee, 0x0a, - 0xd7, 0xc9, 0x35, 0x95, 0xfc, 0xf8, 0xbf, 0x92, 0x3f, 0x2c, 0x63, 0xdb, 0xec, 0x2e, 0x00, 0xe9, - 0x09, 0x69, 0x66, 0x22, 0x0e, 0xc0, 0x1f, 0xc6, 0x28, 0xb9, 0xb8, 0xb0, 0xee, 0xa9, 0x8c, 0xed, - 0x1b, 0x95, 0xc9, 0xa1, 0x57, 0x9a, 0x59, 0xfc, 0x73, 0x59, 0x69, 0xd6, 0x1d, 0x90, 0x8d, 0x6a, - 0x29, 0xe8, 0x23, 0xd2, 0x2a, 0x2a, 0xc5, 0xc2, 0x50, 0x00, 0xea, 0x42, 0xde, 0xf7, 0x9a, 0x7a, - 0x7a, 0xa4, 0x87, 0xf4, 0x09, 0xd9, 0x9c, 0xb0, 0x51, 0x1c, 0x32, 0xc9, 0x97, 0xe4, 0x8a, 0x22, - 0x37, 0xae, 0x84, 0x02, 0xee, 0x7e, 0x22, 0xf5, 0xd2, 0x47, 0xbc, 0x7d, 0xd7, 0xbc, 0x7d, 0x97, - 0xee, 0x91, 0x46, 0xb9, 0x25, 0x2a, 0x63, 0xcd, 0xab, 0x97, 0x1a, 0xd0, 0x7b, 0x3d, 0xfd, 0x63, - 0x1b, 0xd3, 0x99, 0x6d, 0x5e, 0xce, 0x6c, 0xf3, 0xf7, 0xcc, 0x36, 0xbf, 0xcd, 0x6d, 0xe3, 0x72, - 0x6e, 0x1b, 0x3f, 0xe6, 0xb6, 0xf1, 0xd1, 0x89, 0x62, 0x39, 0x1c, 0x9f, 0x39, 0x01, 0x4f, 0xdc, - 0x3e, 0xc7, 0x84, 0x63, 0x9f, 0xa7, 0x52, 0xb0, 0x40, 0xa2, 0xab, 0x9e, 0xe8, 0xf9, 0xe2, 0x91, - 0xca, 0x8b, 0x0c, 0xf0, 0xac, 0xa6, 0x5e, 0xe8, 0xb3, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x8a, - 0x3b, 0x03, 0x5a, 0x04, 0x04, 0x00, 0x00, -} - -func (m *GenesisState) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GenesisState) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.PriceHistory) > 0 { - for iNdEx := len(m.PriceHistory) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.PriceHistory[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } - } - if len(m.AggregateExchangeRateVotes) > 0 { - for iNdEx := len(m.AggregateExchangeRateVotes) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.AggregateExchangeRateVotes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } - } - if len(m.AggregateExchangeRatePrevotes) > 0 { - for iNdEx := len(m.AggregateExchangeRatePrevotes) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.AggregateExchangeRatePrevotes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - } - if len(m.MissCounters) > 0 { - for iNdEx := len(m.MissCounters) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.MissCounters[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - } - if len(m.ExchangeRates) > 0 { - for iNdEx := len(m.ExchangeRates) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.ExchangeRates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - if len(m.FeederDelegations) > 0 { - for iNdEx := len(m.FeederDelegations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.FeederDelegations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - { - size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *FeederDelegation) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *FeederDelegation) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *FeederDelegation) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.ValidatorAddress) > 0 { - i -= len(m.ValidatorAddress) - copy(dAtA[i:], m.ValidatorAddress) - i = encodeVarintGenesis(dAtA, i, uint64(len(m.ValidatorAddress))) - i-- - dAtA[i] = 0x12 - } - if len(m.FeederAddress) > 0 { - i -= len(m.FeederAddress) - copy(dAtA[i:], m.FeederAddress) - i = encodeVarintGenesis(dAtA, i, uint64(len(m.FeederAddress))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MissCounter) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MissCounter) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MissCounter) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.MissCounter != 0 { - i = encodeVarintGenesis(dAtA, i, uint64(m.MissCounter)) - i-- - dAtA[i] = 0x10 - } - if len(m.ValidatorAddress) > 0 { - i -= len(m.ValidatorAddress) - copy(dAtA[i:], m.ValidatorAddress) - i = encodeVarintGenesis(dAtA, i, uint64(len(m.ValidatorAddress))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintGenesis(dAtA []byte, offset int, v uint64) int { - offset -= sovGenesis(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *GenesisState) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Params.Size() - n += 1 + l + sovGenesis(uint64(l)) - if len(m.FeederDelegations) > 0 { - for _, e := range m.FeederDelegations { - l = e.Size() - n += 1 + l + sovGenesis(uint64(l)) - } - } - if len(m.ExchangeRates) > 0 { - for _, e := range m.ExchangeRates { - l = e.Size() - n += 1 + l + sovGenesis(uint64(l)) - } - } - if len(m.MissCounters) > 0 { - for _, e := range m.MissCounters { - l = e.Size() - n += 1 + l + sovGenesis(uint64(l)) - } - } - if len(m.AggregateExchangeRatePrevotes) > 0 { - for _, e := range m.AggregateExchangeRatePrevotes { - l = e.Size() - n += 1 + l + sovGenesis(uint64(l)) - } - } - if len(m.AggregateExchangeRateVotes) > 0 { - for _, e := range m.AggregateExchangeRateVotes { - l = e.Size() - n += 1 + l + sovGenesis(uint64(l)) - } - } - if len(m.PriceHistory) > 0 { - for _, e := range m.PriceHistory { - l = e.Size() - n += 1 + l + sovGenesis(uint64(l)) - } - } - return n -} - -func (m *FeederDelegation) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.FeederAddress) - if l > 0 { - n += 1 + l + sovGenesis(uint64(l)) - } - l = len(m.ValidatorAddress) - if l > 0 { - n += 1 + l + sovGenesis(uint64(l)) - } - return n -} - -func (m *MissCounter) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ValidatorAddress) - if l > 0 { - n += 1 + l + sovGenesis(uint64(l)) - } - if m.MissCounter != 0 { - n += 1 + sovGenesis(uint64(m.MissCounter)) - } - return n -} - -func sovGenesis(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozGenesis(x uint64) (n int) { - return sovGenesis(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *GenesisState) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: GenesisState: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GenesisState: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FeederDelegations", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.FeederDelegations = append(m.FeederDelegations, FeederDelegation{}) - if err := m.FeederDelegations[len(m.FeederDelegations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExchangeRates", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ExchangeRates = append(m.ExchangeRates, ExchangeRateTuple{}) - if err := m.ExchangeRates[len(m.ExchangeRates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MissCounters", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.MissCounters = append(m.MissCounters, MissCounter{}) - if err := m.MissCounters[len(m.MissCounters)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AggregateExchangeRatePrevotes", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.AggregateExchangeRatePrevotes = append(m.AggregateExchangeRatePrevotes, AggregateExchangeRatePrevote{}) - if err := m.AggregateExchangeRatePrevotes[len(m.AggregateExchangeRatePrevotes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AggregateExchangeRateVotes", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.AggregateExchangeRateVotes = append(m.AggregateExchangeRateVotes, AggregateExchangeRateVote{}) - if err := m.AggregateExchangeRateVotes[len(m.AggregateExchangeRateVotes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PriceHistory", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.PriceHistory = append(m.PriceHistory, PriceHistory{}) - if err := m.PriceHistory[len(m.PriceHistory)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenesis(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenesis - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *FeederDelegation) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: FeederDelegation: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: FeederDelegation: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FeederAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.FeederAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ValidatorAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenesis(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenesis - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MissCounter) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MissCounter: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MissCounter: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ValidatorAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field MissCounter", wireType) - } - m.MissCounter = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.MissCounter |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipGenesis(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenesis - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipGenesis(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenesis - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenesis - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenesis - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthGenesis - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupGenesis - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthGenesis - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthGenesis = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowGenesis = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupGenesis = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/oracle/types/genesis_test.go b/x/oracle/types/genesis_test.go deleted file mode 100644 index 87e4a0717..000000000 --- a/x/oracle/types/genesis_test.go +++ /dev/null @@ -1,88 +0,0 @@ -package types - -import ( - "encoding/json" - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" -) - -func TestGenesisValidation(t *testing.T) { - // Valid state - genState := NewGenesisState( - DefaultParams(), - []ExchangeRateTuple{}, - []FeederDelegation{}, - []MissCounter{}, - []AggregateExchangeRatePrevote{}, - []AggregateExchangeRateVote{}, - []PriceHistory{}, - ) - require.NoError(t, ValidateGenesis(genState)) - - // Invalid Vote Period - genState.Params.VotePeriod = 0 - require.Error(t, ValidateGenesis(genState)) - - // Invalid VoteThreshold - genState = DefaultGenesisState() - genState.Params.VoteThreshold = sdk.NewDecWithPrec(33, 2) - require.Error(t, ValidateGenesis(genState)) - - // Invalid Rewardband - genState = DefaultGenesisState() - genState.Params.RewardBand = sdk.NewDec(2) - require.Error(t, ValidateGenesis(genState)) - genState.Params.RewardBand = sdk.NewDec(-1) - require.Error(t, ValidateGenesis(genState)) - - // Invalid RewardDistributionWindow - genState = DefaultGenesisState() - genState.Params.RewardDistributionWindow = genState.Params.VotePeriod - 1 - require.Error(t, ValidateGenesis(genState)) - - // Invalid SlashFraction - genState = DefaultGenesisState() - genState.Params.SlashFraction = sdk.NewDec(2) - require.Error(t, ValidateGenesis(genState)) - genState.Params.SlashFraction = sdk.NewDec(-1) - require.Error(t, ValidateGenesis(genState)) - - // Invalid SlashWindow - genState = DefaultGenesisState() - genState.Params.SlashWindow = genState.Params.VotePeriod - 1 - require.Error(t, ValidateGenesis(genState)) - - // Invalid MinValidPerWindow - genState = DefaultGenesisState() - genState.Params.MinValidPerWindow = sdk.NewDec(2) - require.Error(t, ValidateGenesis(genState)) - genState.Params.MinValidPerWindow = sdk.NewDec(-1) - require.Error(t, ValidateGenesis(genState)) - - // Invalid Whitelist - genState = DefaultGenesisState() - genState.Params.Whitelist = DenomList{Denom{}} - require.Error(t, ValidateGenesis(genState)) -} - -func TestGetGenesisStateFromAppState(t *testing.T) { - emptyGenesis := GenesisState{ - Params: Params{}, - ExchangeRates: []ExchangeRateTuple{}, - FeederDelegations: []FeederDelegation{}, - MissCounters: []MissCounter{}, - AggregateExchangeRatePrevotes: []AggregateExchangeRatePrevote{}, - AggregateExchangeRateVotes: []AggregateExchangeRateVote{}, - PriceHistory: []PriceHistory{}, - } - - bz, err := json.Marshal(emptyGenesis) - require.Nil(t, err) - - require.NotNil(t, GetGenesisStateFromAppState(ModuleCdc, map[string]json.RawMessage{ - ModuleName: bz, - })) - require.NotNil(t, GetGenesisStateFromAppState(ModuleCdc, map[string]json.RawMessage{})) -} diff --git a/x/oracle/types/hash.go b/x/oracle/types/hash.go deleted file mode 100644 index 767b6e5a5..000000000 --- a/x/oracle/types/hash.go +++ /dev/null @@ -1,122 +0,0 @@ -package types - -import ( - "bytes" - "encoding/hex" - "encoding/json" - "fmt" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/tendermint/tendermint/crypto/tmhash" - "gopkg.in/yaml.v3" -) - -var _ yaml.Marshaler = AggregateVoteHash{} - -// AggregateVoteHash is hash value to hide vote exchange rates which is -// formatted as a HEX string: -// SHA256("{salt}:{symbol}:{exchangeRate},...,{symbol}:{exchangeRate}:{voter}") -type AggregateVoteHash []byte - -// GetAggregateVoteHash computes hash value of ExchangeRateVote to avoid -// redundant DecCoins stringify operation. -func GetAggregateVoteHash(salt, exchangeRatesStr string, voter sdk.ValAddress) AggregateVoteHash { - hash := tmhash.NewTruncated() - sourceStr := fmt.Sprintf("%s:%s:%s", salt, exchangeRatesStr, voter.String()) - - if _, err := hash.Write([]byte(sourceStr)); err != nil { - panic(err) - } - - bz := hash.Sum(nil) - return bz -} - -// AggregateVoteHashFromHexString convert hex string to AggregateVoteHash. -func AggregateVoteHashFromHexString(s string) (AggregateVoteHash, error) { - h, err := hex.DecodeString(s) - if err != nil { - return nil, err - } - - return h, nil -} - -// String implements fmt.Stringer interface -func (h AggregateVoteHash) String() string { - return hex.EncodeToString(h) -} - -// Equal does bytes equal check -func (h AggregateVoteHash) Equal(h2 AggregateVoteHash) bool { - return bytes.Equal(h, h2) -} - -// Empty check the name hash has zero length -func (h AggregateVoteHash) Empty() bool { - return len(h) == 0 -} - -// Bytes returns the raw address bytes. -func (h AggregateVoteHash) Bytes() []byte { - return h -} - -// Size returns the raw address bytes. -func (h AggregateVoteHash) Size() int { - return len(h) -} - -// Format implements the fmt.Formatter interface. -func (h AggregateVoteHash) Format(s fmt.State, verb rune) { - switch verb { - case 's': - _, _ = s.Write([]byte(h.String())) - - case 'p': - _, _ = s.Write([]byte(fmt.Sprintf("%p", h))) - - default: - _, _ = s.Write([]byte(fmt.Sprintf("%X", []byte(h)))) - } -} - -// Marshal returns the raw address bytes. It is needed for protobuf -// compatibility. -func (h AggregateVoteHash) Marshal() ([]byte, error) { - return h, nil -} - -// Unmarshal sets the address to the given data. It is needed for protobuf -// compatibility. -func (h *AggregateVoteHash) Unmarshal(data []byte) error { - *h = data - return nil -} - -// MarshalJSON marshals to JSON using Bech32. -func (h AggregateVoteHash) MarshalJSON() ([]byte, error) { - return json.Marshal(h.String()) -} - -// MarshalYAML marshals to YAML using Bech32. -func (h AggregateVoteHash) MarshalYAML() (interface{}, error) { - return h.String(), nil -} - -// UnmarshalJSON unmarshals from JSON assuming Bech32 encoding. -func (h *AggregateVoteHash) UnmarshalJSON(data []byte) error { - var s string - err := json.Unmarshal(data, &s) - if err != nil { - return err - } - - h2, err := AggregateVoteHashFromHexString(s) - if err != nil { - return err - } - - *h = h2 - return nil -} diff --git a/x/oracle/types/hash_test.go b/x/oracle/types/hash_test.go deleted file mode 100644 index cb084e44c..000000000 --- a/x/oracle/types/hash_test.go +++ /dev/null @@ -1,40 +0,0 @@ -package types - -import ( - "encoding/hex" - "testing" - - "github.com/stretchr/testify/require" - "gopkg.in/yaml.v3" - - sdk "github.com/cosmos/cosmos-sdk/types" -) - -func TestAggregateVoteHash(t *testing.T) { - addrs := []sdk.AccAddress{ - sdk.AccAddress([]byte("addr1_______________")), - } - - aggregateVoteHash := GetAggregateVoteHash("salt", "JUNO:100,ATOM:100", sdk.ValAddress(addrs[0])) - hexStr := hex.EncodeToString(aggregateVoteHash) - aggregateVoteHashRes, err := AggregateVoteHashFromHexString(hexStr) - require.NoError(t, err) - require.Equal(t, aggregateVoteHash, aggregateVoteHashRes) - require.True(t, aggregateVoteHash.Equal(aggregateVoteHash)) //nolint:gocritic // used for a test - require.True(t, AggregateVoteHash([]byte{}).Empty()) - - got, _ := yaml.Marshal(&aggregateVoteHash) - require.Equal(t, aggregateVoteHash.String()+"\n", string(got)) - - res := AggregateVoteHash{} - testMarshal(t, &aggregateVoteHash, &res, aggregateVoteHash.MarshalJSON, (&res).UnmarshalJSON) - testMarshal(t, &aggregateVoteHash, &res, aggregateVoteHash.Marshal, (&res).Unmarshal) -} - -func testMarshal(t *testing.T, original, res interface{}, marshal func() ([]byte, error), unmarshal func([]byte) error) { - bz, err := marshal() - require.Nil(t, err) - err = unmarshal(bz) - require.Nil(t, err) - require.Equal(t, original, res) -} diff --git a/x/oracle/types/keys.go b/x/oracle/types/keys.go deleted file mode 100644 index 1b09706ae..000000000 --- a/x/oracle/types/keys.go +++ /dev/null @@ -1,99 +0,0 @@ -package types - -import ( - "fmt" - "strings" - time "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/address" -) - -const ( - // ModuleName is the name of the oracle module - ModuleName = "oracle" - - // StoreKey is the string store representation - StoreKey = ModuleName - - // QuerierRoute is the query router key for the oracle module - QuerierRoute = ModuleName - - // RouterKey is the msg router key for the oracle module - RouterKey = ModuleName -) - -// KVStore key prefixes -var ( - KeyPrefixExchangeRate = []byte{0x01} // prefix for each key to a rate - KeyPrefixFeederDelegation = []byte{0x02} // prefix for each key to a feeder delegation - KeyPrefixMissCounter = []byte{0x03} // prefix for each key to a miss counter - KeyPrefixAggregateExchangeRatePrevote = []byte{0x04} // prefix for each key to a aggregate prevote - KeyPrefixAggregateExchangeRateVote = []byte{0x05} // prefix for each key to a aggregate vote - KeyPrefixPriceHistory = []byte{0x06} // prefix for price history -) - -// Store price history -func GetPriceHistoryKey(symbolDenom string) (key []byte) { - upperSymbolDenom := strings.ToUpper(symbolDenom) - key = append(key, KeyPrefixPriceHistory...) - key = append(key, []byte(upperSymbolDenom)...) - return append(key, 0) // append 0 for null-termination -} - -// GetExchangeRateKey - stored by *denom* -func GetExchangeRateKey(denom string) (key []byte) { - key = append(key, KeyPrefixExchangeRate...) - key = append(key, []byte(denom)...) - return append(key, 0) // append 0 for null-termination -} - -// GetFeederDelegationKey - stored by *Validator* address -func GetFeederDelegationKey(v sdk.ValAddress) (key []byte) { - key = append(key, KeyPrefixFeederDelegation...) - return append(key, address.MustLengthPrefix(v)...) -} - -// GetMissCounterKey - stored by *Validator* address -func GetMissCounterKey(v sdk.ValAddress) (key []byte) { - key = append(key, KeyPrefixMissCounter...) - return append(key, address.MustLengthPrefix(v)...) -} - -// GetAggregateExchangeRatePrevoteKey - stored by *Validator* address -func GetAggregateExchangeRatePrevoteKey(v sdk.ValAddress) (key []byte) { - key = append(key, KeyPrefixAggregateExchangeRatePrevote...) - return append(key, address.MustLengthPrefix(v)...) -} - -// GetAggregateExchangeRateVoteKey - stored by *Validator* address -func GetAggregateExchangeRateVoteKey(v sdk.ValAddress) (key []byte) { - key = append(key, KeyPrefixAggregateExchangeRateVote...) - return append(key, address.MustLengthPrefix(v)...) -} - -var ( - // Contract: Coin denoms cannot contain this character - KeySeparator = "|" - - historicalTimeIndexNoSeparator = "historical_time_index" - - // format is pool id | denom1 | denom2 | time - // made for efficiently getting records given (pool id, denom1, denom2) and time bounds - HistoricalTWAPTimeIndexPrefix = historicalTimeIndexNoSeparator + KeySeparator -) - -func FormatTimeString(t time.Time) string { - return t.UTC().Round(0).Format(sdk.SortableTimeFormat) -} - -func FormatHistoricalDenomIndexKey(accumulatorWriteTime time.Time, denom string) []byte { - timeS := FormatTimeString(accumulatorWriteTime) - upperDenom := strings.ToUpper(denom) - return []byte(fmt.Sprintf("%s%s%s%s", HistoricalTWAPTimeIndexPrefix, upperDenom, KeySeparator, timeS)) -} - -func FormatHistoricalDenomIndexPrefix(denom string) []byte { - upperDenom := strings.ToUpper(denom) - return []byte(fmt.Sprintf("%s%s%s", HistoricalTWAPTimeIndexPrefix, upperDenom, KeySeparator)) -} diff --git a/x/oracle/types/keys_test.go b/x/oracle/types/keys_test.go deleted file mode 100644 index e49557c30..000000000 --- a/x/oracle/types/keys_test.go +++ /dev/null @@ -1,109 +0,0 @@ -package types_test - -import ( - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" - - appparams "github.com/CosmosContracts/juno/v13/app/params" - "github.com/CosmosContracts/juno/v13/x/oracle/types" -) - -func TestGetExchangeRateKey(t *testing.T) { - testCases := []struct { - denom string - // KeyPrefixExchangeRate | []byte(denom) | 0 - expectedKey []byte - }{ - { - denom: appparams.BondDenom, - expectedKey: []byte{0x1, 0x75, 0x6a, 0x75, 0x6e, 0x6f, 0x0}, - }, - { - denom: types.IbcDenomLuna, - expectedKey: []byte{0x1, 0x69, 0x62, 0x63, 0x2f, 0x30, 0x45, 0x46, 0x31, 0x35, 0x44, 0x46, 0x32, 0x46, 0x30, 0x32, 0x34, 0x38, 0x30, 0x41, 0x44, 0x45, 0x30, 0x42, 0x42, 0x36, 0x45, 0x38, 0x35, 0x44, 0x39, 0x45, 0x42, 0x42, 0x35, 0x44, 0x41, 0x45, 0x41, 0x32, 0x38, 0x33, 0x36, 0x44, 0x33, 0x38, 0x36, 0x30, 0x45, 0x39, 0x46, 0x39, 0x37, 0x46, 0x39, 0x41, 0x41, 0x44, 0x45, 0x34, 0x46, 0x35, 0x37, 0x41, 0x33, 0x31, 0x41, 0x41, 0x30, 0x0}, - }, - { - denom: types.IbcDenomAtom, - expectedKey: []byte{0x1, 0x69, 0x62, 0x63, 0x2f, 0x32, 0x37, 0x33, 0x39, 0x34, 0x46, 0x42, 0x30, 0x39, 0x32, 0x44, 0x32, 0x45, 0x43, 0x43, 0x44, 0x35, 0x36, 0x31, 0x32, 0x33, 0x43, 0x37, 0x34, 0x46, 0x33, 0x36, 0x45, 0x34, 0x43, 0x31, 0x46, 0x39, 0x32, 0x36, 0x30, 0x30, 0x31, 0x43, 0x45, 0x41, 0x44, 0x41, 0x39, 0x43, 0x41, 0x39, 0x37, 0x45, 0x41, 0x36, 0x32, 0x32, 0x42, 0x32, 0x35, 0x46, 0x34, 0x31, 0x45, 0x35, 0x45, 0x42, 0x32, 0x0}, - }, - } - - for i, testCase := range testCases { - actualKey := types.GetExchangeRateKey(testCase.denom) - require.Equalf(t, testCase.expectedKey, actualKey, "test %d - expected key: %s should be the same as actual key: %s", i, testCase.expectedKey, actualKey) - } -} - -func TestGetFeederDelegationKey(t *testing.T) { - testCases := []struct { - val sdk.ValAddress - // KeyPrefixFeederDelegation | lengthPrefixed(addr) - expectedKey []byte - }{ - { - val: []byte("addr________________"), - expectedKey: []byte{0x2, 0x14, 0x61, 0x64, 0x64, 0x72, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f}, - }, - } - - for i, testCase := range testCases { - actualKey := types.GetFeederDelegationKey(testCase.val) - require.Equalf(t, testCase.expectedKey, actualKey, "test %d - expected key: %s should be the same as actual key: %s", i, testCase.expectedKey, actualKey) - } -} - -func TestGetMissCounterKey(t *testing.T) { - testCases := []struct { - val sdk.ValAddress - // KeyPrefixMissCounter | lengthPrefixed(addr) - expectedKey []byte - }{ - { - val: []byte("addr________________"), - expectedKey: []byte{0x3, 0x14, 0x61, 0x64, 0x64, 0x72, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f}, - }, - } - - for i, testCase := range testCases { - actualKey := types.GetMissCounterKey(testCase.val) - require.Equalf(t, testCase.expectedKey, actualKey, "test %d - expected key: %s should be the same as actual key: %s", i, testCase.expectedKey, actualKey) - } -} - -func TestGetAggregateExchangeRatePrevoteKey(t *testing.T) { - testCases := []struct { - val sdk.ValAddress - // KeyPrefixAggregateExchangeRatePrevote | lengthPrefixed(addr) - expectedKey []byte - }{ - { - val: []byte("addr________________"), - expectedKey: []byte{0x4, 0x14, 0x61, 0x64, 0x64, 0x72, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f}, - }, - } - - for i, testCase := range testCases { - actualKey := types.GetAggregateExchangeRatePrevoteKey(testCase.val) - require.Equalf(t, testCase.expectedKey, actualKey, "test %d - expected key: %s should be the same as actual key: %s", i, testCase.expectedKey, actualKey) - } -} - -func TestGetAggregateExchangeRateVoteKey(t *testing.T) { - testCases := []struct { - val sdk.ValAddress - // KeyPrefixAggregateExchangeRateVote | lengthPrefixed(addr) - expectedKey []byte - }{ - { - val: []byte("addr________________"), - expectedKey: []byte{0x5, 0x14, 0x61, 0x64, 0x64, 0x72, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f}, - }, - } - - for i, testCase := range testCases { - actualKey := types.GetAggregateExchangeRateVoteKey(testCase.val) - require.Equalf(t, testCase.expectedKey, actualKey, "test %d - expected key: %s should be the same as actual key: %s", i, testCase.expectedKey, actualKey) - } -} diff --git a/x/oracle/types/msgs.go b/x/oracle/types/msgs.go deleted file mode 100644 index 2c45b7d13..000000000 --- a/x/oracle/types/msgs.go +++ /dev/null @@ -1,170 +0,0 @@ -package types - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/tendermint/tendermint/crypto/tmhash" - - "github.com/CosmosContracts/juno/v13/x/oracle/util" -) - -var ( - _ sdk.Msg = &MsgDelegateFeedConsent{} - _ sdk.Msg = &MsgAggregateExchangeRatePrevote{} - _ sdk.Msg = &MsgAggregateExchangeRateVote{} -) - -func NewMsgAggregateExchangeRatePrevote( - hash AggregateVoteHash, - feeder sdk.AccAddress, - validator sdk.ValAddress, -) *MsgAggregateExchangeRatePrevote { - return &MsgAggregateExchangeRatePrevote{ - Hash: hash.String(), - Feeder: feeder.String(), - Validator: validator.String(), - } -} - -// Type implements LegacyMsg interface -func (msg MsgAggregateExchangeRatePrevote) Type() string { return sdk.MsgTypeURL(&msg) } - -// GetSignBytes implements sdk.Msg -func (msg MsgAggregateExchangeRatePrevote) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&msg)) -} - -// GetSigners implements sdk.Msg -func (msg MsgAggregateExchangeRatePrevote) GetSigners() []sdk.AccAddress { - return util.Signers(msg.Feeder) -} - -// ValidateBasic Implements sdk.Msg -func (msg MsgAggregateExchangeRatePrevote) ValidateBasic() error { - _, err := AggregateVoteHashFromHexString(msg.Hash) - if err != nil { - return sdkerrors.Wrapf(ErrInvalidHash, "invalid vote hash (%s)", err) - } - - // HEX encoding doubles the hash length - if len(msg.Hash) != tmhash.TruncatedSize*2 { - return ErrInvalidHashLength - } - - _, err = sdk.AccAddressFromBech32(msg.Feeder) - if err != nil { - return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid feeder address (%s)", err) - } - - _, err = sdk.ValAddressFromBech32(msg.Validator) - if err != nil { - return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid operator address (%s)", err) - } - - return nil -} - -func NewMsgAggregateExchangeRateVote( - salt string, - exchangeRates string, - feeder sdk.AccAddress, - validator sdk.ValAddress, -) *MsgAggregateExchangeRateVote { - return &MsgAggregateExchangeRateVote{ - Salt: salt, - ExchangeRates: exchangeRates, - Feeder: feeder.String(), - Validator: validator.String(), - } -} - -// Type implements LegacyMsg interface -func (msg MsgAggregateExchangeRateVote) Type() string { return sdk.MsgTypeURL(&msg) } - -// GetSignBytes implements sdk.Msg -func (msg MsgAggregateExchangeRateVote) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&msg)) -} - -// GetSigners implements sdk.Msg -func (msg MsgAggregateExchangeRateVote) GetSigners() []sdk.AccAddress { - return util.Signers(msg.Feeder) -} - -// ValidateBasic implements sdk.Msg -func (msg MsgAggregateExchangeRateVote) ValidateBasic() error { - _, err := sdk.AccAddressFromBech32(msg.Feeder) - if err != nil { - return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid feeder address (%s)", err) - } - - _, err = sdk.ValAddressFromBech32(msg.Validator) - if err != nil { - return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid operator address (%s)", err) - } - - if l := len(msg.ExchangeRates); l == 0 { - return sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, "must provide at least one oracle exchange rate") - } else if l > 4096 { - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "exchange rates string can not exceed 4096 characters") - } - - exchangeRates, err := ParseExchangeRateTuples(msg.ExchangeRates) - if err != nil { - return sdkerrors.Wrap(sdkerrors.ErrInvalidCoins, "failed to parse exchange rates string cause: "+err.Error()) - } - - for _, exchangeRate := range exchangeRates { - // check overflow bit length - if exchangeRate.ExchangeRate.BigInt().BitLen() > 255+sdk.DecimalPrecisionBits { - return sdkerrors.Wrap(ErrInvalidExchangeRate, "overflow") - } - } - - if len(msg.Salt) != 64 { - return ErrInvalidSaltLength - } - _, err = AggregateVoteHashFromHexString(msg.Salt) - if err != nil { - return sdkerrors.Wrap(ErrInvalidSaltFormat, "salt must be a valid hex string") - } - - return nil -} - -// NewMsgDelegateFeedConsent creates a MsgDelegateFeedConsent instance -func NewMsgDelegateFeedConsent(operatorAddress sdk.ValAddress, feederAddress sdk.AccAddress) *MsgDelegateFeedConsent { - return &MsgDelegateFeedConsent{ - Operator: operatorAddress.String(), - Delegate: feederAddress.String(), - } -} - -// Type implements LegacyMsg interface -func (msg MsgDelegateFeedConsent) Type() string { return sdk.MsgTypeURL(&msg) } - -// GetSignBytes implements sdk.Msg -func (msg MsgDelegateFeedConsent) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&msg)) -} - -// GetSigners implements sdk.Msg -func (msg MsgDelegateFeedConsent) GetSigners() []sdk.AccAddress { - operator, _ := sdk.ValAddressFromBech32(msg.Operator) - return []sdk.AccAddress{sdk.AccAddress(operator)} -} - -// ValidateBasic implements sdk.Msg -func (msg MsgDelegateFeedConsent) ValidateBasic() error { - _, err := sdk.ValAddressFromBech32(msg.Operator) - if err != nil { - return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid operator address (%s)", err) - } - - _, err = sdk.AccAddressFromBech32(msg.Delegate) - if err != nil { - return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid delegate address (%s)", err) - } - - return nil -} diff --git a/x/oracle/types/msgs_test.go b/x/oracle/types/msgs_test.go deleted file mode 100644 index 4d8728272..000000000 --- a/x/oracle/types/msgs_test.go +++ /dev/null @@ -1,170 +0,0 @@ -package types - -import ( - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" -) - -func TestMsgFeederDelegation(t *testing.T) { - addrs := []sdk.AccAddress{ - sdk.AccAddress([]byte("addr1_______________")), - sdk.AccAddress([]byte("addr2_______________")), - } - - msgInvalidOperatorAddr := "invalid operator address (empty address string is not allowed): invalid address" //nolint:goconst - msgInvalidDelegatorAddr := "invalid delegate address (empty address string is not allowed): invalid address" - - tests := []struct { - delegator sdk.ValAddress - delegate sdk.AccAddress - expectPass bool - expectedErrorMsg string - }{ - {sdk.ValAddress(addrs[0]), addrs[1], true, "test should pass"}, - {sdk.ValAddress{}, addrs[1], false, msgInvalidOperatorAddr}, - {sdk.ValAddress(addrs[0]), sdk.AccAddress{}, false, msgInvalidDelegatorAddr}, - {nil, nil, false, msgInvalidOperatorAddr}, - } - - for i, tc := range tests { - msg := NewMsgDelegateFeedConsent(tc.delegator, tc.delegate) - if tc.expectPass { - require.Nil(t, msg.ValidateBasic(), "test: %v", i) - } else { - require.ErrorContainsf(t, msg.ValidateBasic(), tc.expectedErrorMsg, "test: %v", i) - } - } -} - -func TestMsgAggregateExchangeRatePrevote(t *testing.T) { - addrs := []sdk.AccAddress{ - sdk.AccAddress([]byte("addr1_______________")), - } - - exchangeRates := sdk.DecCoins{sdk.NewDecCoinFromDec(JunoDenom, sdk.OneDec()), sdk.NewDecCoinFromDec(JunoDenom, sdk.NewDecWithPrec(32121, 1))} - bz := GetAggregateVoteHash("1", exchangeRates.String(), sdk.ValAddress(addrs[0])) - msgInvalidHashLength := "invalid hash length; should equal 20" - msgInvalidFeederAddr := "invalid feeder address (empty address string is not allowed): invalid address" - msgInvalidOperatorAddr := "invalid operator address (empty address string is not allowed): invalid address" - - tests := []struct { - hash AggregateVoteHash - exchangeRates sdk.DecCoins - feeder sdk.AccAddress - validator sdk.AccAddress - expectPass bool - expectedErrorMsg string - }{ - {bz, exchangeRates, addrs[0], addrs[0], true, "test should pass"}, - {bz[1:], exchangeRates, addrs[0], addrs[0], false, msgInvalidHashLength}, - {[]byte("0\x01"), exchangeRates, addrs[0], addrs[0], false, msgInvalidHashLength}, - {AggregateVoteHash{}, exchangeRates, addrs[0], addrs[0], false, msgInvalidHashLength}, - {bz, exchangeRates, sdk.AccAddress{}, addrs[0], false, msgInvalidFeederAddr}, - {bz, exchangeRates, addrs[0], sdk.AccAddress{}, false, msgInvalidOperatorAddr}, - } - - for i, tc := range tests { - msg := NewMsgAggregateExchangeRatePrevote(tc.hash, tc.feeder, sdk.ValAddress(tc.validator)) - if tc.expectPass { - require.NoError(t, msg.ValidateBasic(), "test: %v", i) - } else { - require.ErrorContainsf(t, msg.ValidateBasic(), tc.expectedErrorMsg, "test: %v", i) - } - } -} - -func TestMsgAggregateExchangeRateVote(t *testing.T) { - addrs := []sdk.AccAddress{ - sdk.AccAddress([]byte("addr1_______________")), - } - - invalidExchangeRates := "a,b" - exchangeRates := "foo:1.0,bar:1232.123" - zeroExchangeRates := "foo:0.0,bar:1232.132" - negativeExchangeRates := "foo:-1234.5,bar:1232.132" - overFlowMsgExchangeRates := StringWithCharset(4097, "56432") - overFlowExchangeRates := "foo:100000000000000000000000000000000000000000000000000000000000000000000000000000.01,bar:1232.132" - validSalt := "0cf33fb528b388660c3a42c3f3250e983395290b75fef255050fb5bc48a6025f" - saltWithColon := "0cf33fb528b388660c3a42c3f3250e983395290b75fef255050fb5bc48a6025:" - msgInvalidSalt := "invalid salt length; must be 64" - msgInvalidOverflowValue := "out of range; bitLen:" - msgInvalidHexString := "salt must be a valid hex string: invalid salt format" - msgInvalidUnknownRequest := "must provide at least one oracle exchange rate: unknown request" - msgInvalidFeederAddr := "invalid feeder address (empty address string is not allowed): invalid address" - msgInvalidOperatorAddr := "invalid operator address (empty address string is not allowed): invalid address" - msgInvalidOraclePrice := "failed to parse exchange rates string cause: invalid oracle price: invalid coins" - msgInvalidOverflowExceedCharacter := "exchange rates string can not exceed 4096 characters: invalid request" - msgInvalidExchangeRates := "failed to parse exchange rates string cause: invalid exchange rate a: invalid coins" - - tests := []struct { - feeder sdk.AccAddress - validator sdk.AccAddress - salt string - exchangeRates string - expectPass bool - expectedErrorMsg string - }{ - {addrs[0], addrs[0], validSalt, exchangeRates, true, "test should pass"}, - {addrs[0], addrs[0], validSalt, invalidExchangeRates, false, msgInvalidExchangeRates}, - {addrs[0], addrs[0], validSalt, zeroExchangeRates, false, msgInvalidOraclePrice}, - {addrs[0], addrs[0], validSalt, negativeExchangeRates, false, msgInvalidOraclePrice}, - {addrs[0], addrs[0], validSalt, overFlowMsgExchangeRates, false, msgInvalidOverflowExceedCharacter}, - {addrs[0], addrs[0], validSalt, overFlowExchangeRates, false, msgInvalidOverflowValue}, - {sdk.AccAddress{}, sdk.AccAddress{}, validSalt, exchangeRates, false, msgInvalidFeederAddr}, - {addrs[0], sdk.AccAddress{}, validSalt, exchangeRates, false, msgInvalidOperatorAddr}, - {addrs[0], addrs[0], "", exchangeRates, false, msgInvalidSalt}, - {addrs[0], addrs[0], validSalt, "", false, msgInvalidUnknownRequest}, - {addrs[0], addrs[0], saltWithColon, exchangeRates, false, msgInvalidHexString}, - } - - for i, tc := range tests { - msg := NewMsgAggregateExchangeRateVote(tc.salt, tc.exchangeRates, tc.feeder, sdk.ValAddress(tc.validator)) - if tc.expectPass { - require.Nil(t, msg.ValidateBasic(), "test: %v", i) - } else { - require.ErrorContainsf(t, msg.ValidateBasic(), tc.expectedErrorMsg, "test: %v", i) - } - } -} - -func TestNewMsgAggregateExchangeRatePrevote(t *testing.T) { - vals := GenerateRandomValAddr(2) - feederAddr := sdk.AccAddress(vals[1]) - - exchangeRates := sdk.DecCoins{sdk.NewDecCoinFromDec(JunoDenom, sdk.OneDec()), sdk.NewDecCoinFromDec(JunoDenom, sdk.NewDecWithPrec(32121, 1))} - bz := GetAggregateVoteHash("1", exchangeRates.String(), vals[0]) - - aggregateExchangeRatePreVote := NewMsgAggregateExchangeRatePrevote( - bz, - feederAddr, - vals[0], - ) - - require.NotNil(t, aggregateExchangeRatePreVote.GetSignBytes()) - require.Equal(t, aggregateExchangeRatePreVote.GetSigners(), []sdk.AccAddress{feederAddr}) -} - -func TestNewMsgAggregateExchangeRateVote(t *testing.T) { - vals := GenerateRandomValAddr(2) - feederAddr := sdk.AccAddress(vals[1]) - - aggregateExchangeRateVote := NewMsgAggregateExchangeRateVote( - "salt", - "0.1", - feederAddr, - vals[0], - ) - - require.NotNil(t, aggregateExchangeRateVote.GetSignBytes()) - require.Equal(t, aggregateExchangeRateVote.GetSigners(), []sdk.AccAddress{feederAddr}) -} - -func TestMsgDelegateFeedConsent(t *testing.T) { - vals := GenerateRandomValAddr(2) - msgFeedConsent := NewMsgDelegateFeedConsent(vals[0], sdk.AccAddress(vals[1])) - - require.NotNil(t, msgFeedConsent.GetSignBytes()) - require.Equal(t, msgFeedConsent.GetSigners(), []sdk.AccAddress{sdk.AccAddress(vals[0])}) -} diff --git a/x/oracle/types/oracle.pb.go b/x/oracle/types/oracle.pb.go deleted file mode 100644 index 79a185372..000000000 --- a/x/oracle/types/oracle.pb.go +++ /dev/null @@ -1,2176 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: juno/oracle/v1/oracle.proto - -package types - -import ( - fmt "fmt" - github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/gogo/protobuf/proto" - github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" - _ "google.golang.org/protobuf/types/known/durationpb" - _ "google.golang.org/protobuf/types/known/timestamppb" - io "io" - math "math" - math_bits "math/bits" - time "time" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf -var _ = time.Kitchen - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// Params defines the parameters for the oracle module. -type Params struct { - VotePeriod uint64 `protobuf:"varint,1,opt,name=vote_period,json=votePeriod,proto3" json:"vote_period,omitempty" yaml:"vote_period"` - VoteThreshold github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=vote_threshold,json=voteThreshold,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"vote_threshold" yaml:"vote_threshold"` - RewardBand github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=reward_band,json=rewardBand,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"reward_band" yaml:"reward_band"` - RewardDistributionWindow uint64 `protobuf:"varint,4,opt,name=reward_distribution_window,json=rewardDistributionWindow,proto3" json:"reward_distribution_window,omitempty" yaml:"reward_distribution_window"` - Whitelist DenomList `protobuf:"bytes,5,rep,name=whitelist,proto3,castrepeated=DenomList" json:"whitelist" yaml:"whitelist"` - SlashFraction github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,6,opt,name=slash_fraction,json=slashFraction,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"slash_fraction" yaml:"slash_fraction"` - SlashWindow uint64 `protobuf:"varint,7,opt,name=slash_window,json=slashWindow,proto3" json:"slash_window,omitempty" yaml:"slash_window"` - MinValidPerWindow github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,8,opt,name=min_valid_per_window,json=minValidPerWindow,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"min_valid_per_window" yaml:"min_valid_per_window"` - TwapTrackingList DenomList `protobuf:"bytes,9,rep,name=twap_tracking_list,json=twapTrackingList,proto3,castrepeated=DenomList" json:"twap_tracking_list" yaml:"twap_tracking_list"` - TwapDuration time.Duration `protobuf:"bytes,10,opt,name=twap_duration,json=twapDuration,proto3,stdduration" json:"twap_duration,omitempty" yaml:"twap_duration"` -} - -func (m *Params) Reset() { *m = Params{} } -func (*Params) ProtoMessage() {} -func (*Params) Descriptor() ([]byte, []int) { - return fileDescriptor_2c93384b33764fc8, []int{0} -} -func (m *Params) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Params) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Params.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Params) XXX_Merge(src proto.Message) { - xxx_messageInfo_Params.Merge(m, src) -} -func (m *Params) XXX_Size() int { - return m.Size() -} -func (m *Params) XXX_DiscardUnknown() { - xxx_messageInfo_Params.DiscardUnknown(m) -} - -var xxx_messageInfo_Params proto.InternalMessageInfo - -// Denom - the object to hold configurations of each denom -type Denom struct { - BaseDenom string `protobuf:"bytes,1,opt,name=base_denom,json=baseDenom,proto3" json:"base_denom,omitempty" yaml:"base_denom"` - SymbolDenom string `protobuf:"bytes,2,opt,name=symbol_denom,json=symbolDenom,proto3" json:"symbol_denom,omitempty" yaml:"symbol_denom"` - Exponent uint32 `protobuf:"varint,3,opt,name=exponent,proto3" json:"exponent,omitempty" yaml:"exponent"` -} - -func (m *Denom) Reset() { *m = Denom{} } -func (*Denom) ProtoMessage() {} -func (*Denom) Descriptor() ([]byte, []int) { - return fileDescriptor_2c93384b33764fc8, []int{1} -} -func (m *Denom) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Denom) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Denom.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Denom) XXX_Merge(src proto.Message) { - xxx_messageInfo_Denom.Merge(m, src) -} -func (m *Denom) XXX_Size() int { - return m.Size() -} -func (m *Denom) XXX_DiscardUnknown() { - xxx_messageInfo_Denom.DiscardUnknown(m) -} - -var xxx_messageInfo_Denom proto.InternalMessageInfo - -type PriceHistoryEntry struct { - Price github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,1,opt,name=price,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"price" yaml:"price"` - VotePeriodCount uint64 `protobuf:"varint,2,opt,name=vote_period_count,json=votePeriodCount,proto3" json:"vote_period_count,omitempty"` - PriceUpdateTime time.Time `protobuf:"bytes,3,opt,name=price_update_time,json=priceUpdateTime,proto3,stdtime" json:"price_update_time" yaml:"price_update_time"` -} - -func (m *PriceHistoryEntry) Reset() { *m = PriceHistoryEntry{} } -func (m *PriceHistoryEntry) String() string { return proto.CompactTextString(m) } -func (*PriceHistoryEntry) ProtoMessage() {} -func (*PriceHistoryEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_2c93384b33764fc8, []int{2} -} -func (m *PriceHistoryEntry) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *PriceHistoryEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PriceHistoryEntry.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *PriceHistoryEntry) XXX_Merge(src proto.Message) { - xxx_messageInfo_PriceHistoryEntry.Merge(m, src) -} -func (m *PriceHistoryEntry) XXX_Size() int { - return m.Size() -} -func (m *PriceHistoryEntry) XXX_DiscardUnknown() { - xxx_messageInfo_PriceHistoryEntry.DiscardUnknown(m) -} - -var xxx_messageInfo_PriceHistoryEntry proto.InternalMessageInfo - -// History Price -type PriceHistory struct { - Denom Denom `protobuf:"bytes,1,opt,name=denom,proto3" json:"denom" yaml:"denom"` - PriceHistoryEntry []PriceHistoryEntry `protobuf:"bytes,2,rep,name=price_history_entry,json=priceHistoryEntry,proto3" json:"price_history_entry" yaml:"price_history_entry"` -} - -func (m *PriceHistory) Reset() { *m = PriceHistory{} } -func (m *PriceHistory) String() string { return proto.CompactTextString(m) } -func (*PriceHistory) ProtoMessage() {} -func (*PriceHistory) Descriptor() ([]byte, []int) { - return fileDescriptor_2c93384b33764fc8, []int{3} -} -func (m *PriceHistory) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *PriceHistory) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PriceHistory.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *PriceHistory) XXX_Merge(src proto.Message) { - xxx_messageInfo_PriceHistory.Merge(m, src) -} -func (m *PriceHistory) XXX_Size() int { - return m.Size() -} -func (m *PriceHistory) XXX_DiscardUnknown() { - xxx_messageInfo_PriceHistory.DiscardUnknown(m) -} - -var xxx_messageInfo_PriceHistory proto.InternalMessageInfo - -// AggregateExchangeRatePrevote - -// struct for aggregate prevoting on the ExchangeRateVote. -// The purpose of aggregate prevote is to hide vote exchange rates with hash -// which is formatted as hex string in SHA256("{salt}:{exchange -// rate}{denom},...,{exchange rate}{denom}:{voter}") -type AggregateExchangeRatePrevote struct { - Hash string `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty" yaml:"hash"` - Voter string `protobuf:"bytes,2,opt,name=voter,proto3" json:"voter,omitempty" yaml:"voter"` - SubmitBlock uint64 `protobuf:"varint,3,opt,name=submit_block,json=submitBlock,proto3" json:"submit_block,omitempty" yaml:"submit_block"` -} - -func (m *AggregateExchangeRatePrevote) Reset() { *m = AggregateExchangeRatePrevote{} } -func (*AggregateExchangeRatePrevote) ProtoMessage() {} -func (*AggregateExchangeRatePrevote) Descriptor() ([]byte, []int) { - return fileDescriptor_2c93384b33764fc8, []int{4} -} -func (m *AggregateExchangeRatePrevote) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *AggregateExchangeRatePrevote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_AggregateExchangeRatePrevote.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *AggregateExchangeRatePrevote) XXX_Merge(src proto.Message) { - xxx_messageInfo_AggregateExchangeRatePrevote.Merge(m, src) -} -func (m *AggregateExchangeRatePrevote) XXX_Size() int { - return m.Size() -} -func (m *AggregateExchangeRatePrevote) XXX_DiscardUnknown() { - xxx_messageInfo_AggregateExchangeRatePrevote.DiscardUnknown(m) -} - -var xxx_messageInfo_AggregateExchangeRatePrevote proto.InternalMessageInfo - -// AggregateExchangeRateVote - struct for voting on -// the exchange rates of USD denominated in various assets. -type AggregateExchangeRateVote struct { - ExchangeRateTuples ExchangeRateTuples `protobuf:"bytes,1,rep,name=exchange_rate_tuples,json=exchangeRateTuples,proto3,castrepeated=ExchangeRateTuples" json:"exchange_rate_tuples" yaml:"exchange_rate_tuples"` - Voter string `protobuf:"bytes,2,opt,name=voter,proto3" json:"voter,omitempty" yaml:"voter"` -} - -func (m *AggregateExchangeRateVote) Reset() { *m = AggregateExchangeRateVote{} } -func (*AggregateExchangeRateVote) ProtoMessage() {} -func (*AggregateExchangeRateVote) Descriptor() ([]byte, []int) { - return fileDescriptor_2c93384b33764fc8, []int{5} -} -func (m *AggregateExchangeRateVote) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *AggregateExchangeRateVote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_AggregateExchangeRateVote.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *AggregateExchangeRateVote) XXX_Merge(src proto.Message) { - xxx_messageInfo_AggregateExchangeRateVote.Merge(m, src) -} -func (m *AggregateExchangeRateVote) XXX_Size() int { - return m.Size() -} -func (m *AggregateExchangeRateVote) XXX_DiscardUnknown() { - xxx_messageInfo_AggregateExchangeRateVote.DiscardUnknown(m) -} - -var xxx_messageInfo_AggregateExchangeRateVote proto.InternalMessageInfo - -// ExchangeRateTuple - struct to store interpreted exchange rates data to store -type ExchangeRateTuple struct { - Denom string `protobuf:"bytes,1,opt,name=denom,proto3" json:"denom,omitempty" yaml:"denom"` - ExchangeRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=exchange_rate,json=exchangeRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"exchange_rate" yaml:"exchange_rate"` -} - -func (m *ExchangeRateTuple) Reset() { *m = ExchangeRateTuple{} } -func (*ExchangeRateTuple) ProtoMessage() {} -func (*ExchangeRateTuple) Descriptor() ([]byte, []int) { - return fileDescriptor_2c93384b33764fc8, []int{6} -} -func (m *ExchangeRateTuple) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ExchangeRateTuple) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ExchangeRateTuple.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *ExchangeRateTuple) XXX_Merge(src proto.Message) { - xxx_messageInfo_ExchangeRateTuple.Merge(m, src) -} -func (m *ExchangeRateTuple) XXX_Size() int { - return m.Size() -} -func (m *ExchangeRateTuple) XXX_DiscardUnknown() { - xxx_messageInfo_ExchangeRateTuple.DiscardUnknown(m) -} - -var xxx_messageInfo_ExchangeRateTuple proto.InternalMessageInfo - -func init() { - proto.RegisterType((*Params)(nil), "juno.oracle.v1.Params") - proto.RegisterType((*Denom)(nil), "juno.oracle.v1.Denom") - proto.RegisterType((*PriceHistoryEntry)(nil), "juno.oracle.v1.PriceHistoryEntry") - proto.RegisterType((*PriceHistory)(nil), "juno.oracle.v1.PriceHistory") - proto.RegisterType((*AggregateExchangeRatePrevote)(nil), "juno.oracle.v1.AggregateExchangeRatePrevote") - proto.RegisterType((*AggregateExchangeRateVote)(nil), "juno.oracle.v1.AggregateExchangeRateVote") - proto.RegisterType((*ExchangeRateTuple)(nil), "juno.oracle.v1.ExchangeRateTuple") -} - -func init() { proto.RegisterFile("juno/oracle/v1/oracle.proto", fileDescriptor_2c93384b33764fc8) } - -var fileDescriptor_2c93384b33764fc8 = []byte{ - // 1059 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x56, 0x4d, 0x6f, 0xdc, 0x44, - 0x18, 0x5e, 0xb7, 0x49, 0xc8, 0xce, 0x6e, 0x9a, 0xec, 0x64, 0x43, 0x9d, 0x04, 0xad, 0xd3, 0x81, - 0x56, 0x11, 0x02, 0xaf, 0x1a, 0x90, 0x10, 0x41, 0x42, 0xaa, 0x93, 0x16, 0x0e, 0x45, 0x8a, 0xac, - 0x50, 0xa4, 0x5e, 0xac, 0x59, 0x7b, 0xea, 0x35, 0xb1, 0x3d, 0x96, 0x3d, 0x4e, 0xb2, 0x42, 0x42, - 0x42, 0x5c, 0x38, 0xa1, 0x1e, 0x7b, 0xcc, 0x99, 0x3b, 0x88, 0x9f, 0x90, 0x63, 0x8f, 0x88, 0x83, - 0x0b, 0xc9, 0x05, 0x71, 0xdc, 0x5f, 0x80, 0xe6, 0xc3, 0x59, 0xef, 0x47, 0x11, 0x11, 0xa7, 0xdd, - 0xf7, 0xeb, 0x79, 0xde, 0xf7, 0x7d, 0x66, 0x46, 0x06, 0x9b, 0x5f, 0xe7, 0x31, 0xed, 0xd2, 0x14, - 0xbb, 0x21, 0xe9, 0x1e, 0xdf, 0x57, 0xff, 0xcc, 0x24, 0xa5, 0x8c, 0xc2, 0x5b, 0x3c, 0x68, 0x2a, - 0xd7, 0xf1, 0xfd, 0x8d, 0xb6, 0x4f, 0x7d, 0x2a, 0x42, 0x5d, 0xfe, 0x4f, 0x66, 0x6d, 0x74, 0x7c, - 0x4a, 0xfd, 0x90, 0x74, 0x85, 0xd5, 0xcb, 0x9f, 0x75, 0xbd, 0x3c, 0xc5, 0x2c, 0xa0, 0xb1, 0x8a, - 0x1b, 0x93, 0x71, 0x16, 0x44, 0x24, 0x63, 0x38, 0x4a, 0x64, 0x02, 0xfa, 0x6e, 0x11, 0x2c, 0x1c, - 0xe0, 0x14, 0x47, 0x19, 0xfc, 0x08, 0x34, 0x8e, 0x29, 0x23, 0x4e, 0x42, 0xd2, 0x80, 0x7a, 0xba, - 0xb6, 0xa5, 0x6d, 0xcf, 0x59, 0x6f, 0x0e, 0x0b, 0x03, 0x0e, 0x70, 0x14, 0xee, 0xa2, 0x4a, 0x10, - 0xd9, 0x80, 0x5b, 0x07, 0xc2, 0x80, 0x31, 0xb8, 0x25, 0x62, 0xac, 0x9f, 0x92, 0xac, 0x4f, 0x43, - 0x4f, 0xbf, 0xb1, 0xa5, 0x6d, 0xd7, 0xad, 0xcf, 0xce, 0x0b, 0xa3, 0xf6, 0x7b, 0x61, 0xdc, 0xf3, - 0x03, 0xd6, 0xcf, 0x7b, 0xa6, 0x4b, 0xa3, 0xae, 0x4b, 0xb3, 0x88, 0x66, 0xea, 0xe7, 0xfd, 0xcc, - 0x3b, 0xea, 0xb2, 0x41, 0x42, 0x32, 0x73, 0x9f, 0xb8, 0xc3, 0xc2, 0x58, 0xab, 0x30, 0x5d, 0xa1, - 0x21, 0x7b, 0x89, 0x3b, 0x0e, 0x4b, 0x1b, 0x12, 0xd0, 0x48, 0xc9, 0x09, 0x4e, 0x3d, 0xa7, 0x87, - 0x63, 0x4f, 0xbf, 0x29, 0xc8, 0xf6, 0xaf, 0x4d, 0xa6, 0xc6, 0xaa, 0x40, 0x21, 0x1b, 0x48, 0xcb, - 0xc2, 0xb1, 0x07, 0x5d, 0xb0, 0xa1, 0x62, 0x5e, 0x90, 0xb1, 0x34, 0xe8, 0xe5, 0x7c, 0xb1, 0xce, - 0x49, 0x10, 0x7b, 0xf4, 0x44, 0x9f, 0x13, 0xeb, 0xb9, 0x3b, 0x2c, 0x8c, 0x3b, 0x63, 0x38, 0x33, - 0x72, 0x91, 0xad, 0xcb, 0xe0, 0x7e, 0x25, 0xf6, 0x95, 0x08, 0xc1, 0xa7, 0xa0, 0x7e, 0xd2, 0x0f, - 0x18, 0x09, 0x83, 0x8c, 0xe9, 0xf3, 0x5b, 0x37, 0xb7, 0x1b, 0x3b, 0x6b, 0xe6, 0xb8, 0xf4, 0xe6, - 0x3e, 0x89, 0x69, 0x64, 0xdd, 0xe5, 0x03, 0x0e, 0x0b, 0x63, 0x45, 0xd2, 0x5d, 0x55, 0xa1, 0x9f, - 0x5e, 0x19, 0x75, 0x91, 0xf2, 0x38, 0xc8, 0x98, 0x3d, 0x82, 0xe3, 0xba, 0x64, 0x21, 0xce, 0xfa, - 0xce, 0xb3, 0x14, 0xbb, 0x9c, 0x53, 0x5f, 0xf8, 0x7f, 0xba, 0x8c, 0xa3, 0x21, 0x7b, 0x49, 0x38, - 0x1e, 0x29, 0x1b, 0xee, 0x82, 0xa6, 0xcc, 0x50, 0x2b, 0x7a, 0x43, 0xac, 0xe8, 0xf6, 0xb0, 0x30, - 0x56, 0xab, 0xf5, 0xe5, 0x52, 0x1a, 0xc2, 0x54, 0x7b, 0xf8, 0x16, 0xb4, 0xa3, 0x20, 0x76, 0x8e, - 0x71, 0x18, 0x78, 0xfc, 0x90, 0x95, 0x18, 0x8b, 0xa2, 0xe3, 0x2f, 0xae, 0xdd, 0xf1, 0xa6, 0x64, - 0x9c, 0x85, 0x89, 0xec, 0x56, 0x14, 0xc4, 0x4f, 0xb8, 0xf7, 0x80, 0xa4, 0x8a, 0x3f, 0x03, 0x90, - 0x9d, 0xe0, 0xc4, 0x61, 0x29, 0x76, 0x8f, 0x82, 0xd8, 0x77, 0x84, 0x20, 0xf5, 0x7f, 0x13, 0xc4, - 0x54, 0x82, 0xac, 0x4b, 0xaa, 0xe9, 0xf2, 0x09, 0x65, 0x56, 0x78, 0xc6, 0xa1, 0x4a, 0xe0, 0x1e, - 0xf8, 0x0d, 0x58, 0x12, 0x55, 0xe5, 0xa5, 0xd5, 0xc1, 0x96, 0xb6, 0xdd, 0xd8, 0x59, 0x37, 0xe5, - 0xad, 0x35, 0xcb, 0x5b, 0x6b, 0xee, 0xab, 0x04, 0xeb, 0x13, 0xce, 0xf9, 0x77, 0x61, 0xdc, 0x1e, - 0xab, 0x7b, 0x8f, 0x46, 0x01, 0x23, 0x51, 0xc2, 0x06, 0xc3, 0xc2, 0x68, 0x57, 0xda, 0x29, 0x13, - 0xd0, 0x8b, 0x57, 0x86, 0x66, 0x37, 0xb9, 0xaf, 0x84, 0xda, 0x5d, 0x7c, 0x71, 0x66, 0xd4, 0xfe, - 0x3a, 0x33, 0x34, 0xf4, 0xab, 0x06, 0xe6, 0x45, 0x9b, 0xf0, 0x43, 0x00, 0x7a, 0x38, 0x23, 0x8e, - 0xc7, 0x2d, 0xf1, 0x02, 0xd4, 0xad, 0xb5, 0x61, 0x61, 0xb4, 0x24, 0xe6, 0x28, 0x86, 0xec, 0x3a, - 0x37, 0x64, 0x15, 0xd7, 0x7d, 0x10, 0xf5, 0x68, 0xa8, 0xea, 0xe4, 0xed, 0xaf, 0xea, 0x5e, 0x89, - 0x72, 0xdd, 0x85, 0x29, 0x6b, 0xbb, 0x60, 0x91, 0x9c, 0x26, 0x34, 0x26, 0x31, 0x13, 0x17, 0x79, - 0xc9, 0x5a, 0x1d, 0x16, 0xc6, 0xb2, 0xac, 0x2b, 0x23, 0xc8, 0xbe, 0x4a, 0xda, 0x6d, 0xfe, 0x70, - 0x66, 0xd4, 0x54, 0xeb, 0x35, 0xf4, 0xfd, 0x0d, 0xd0, 0x3a, 0x48, 0x03, 0x97, 0x7c, 0x1e, 0x64, - 0x8c, 0xa6, 0x83, 0x87, 0x31, 0x4b, 0x07, 0xf0, 0x10, 0xcc, 0x27, 0xdc, 0xa9, 0x26, 0xf8, 0xf4, - 0xda, 0xa7, 0xa7, 0x29, 0xf9, 0x05, 0x08, 0xb2, 0x25, 0x18, 0x7c, 0x17, 0xb4, 0x2a, 0x4f, 0xa0, - 0xe3, 0xd2, 0x3c, 0x66, 0x62, 0xd6, 0x39, 0x7b, 0x79, 0xf4, 0x1a, 0xee, 0x71, 0x37, 0x0c, 0x41, - 0x4b, 0x14, 0x39, 0x79, 0xe2, 0x61, 0xfe, 0x98, 0x05, 0x11, 0x11, 0xf3, 0x35, 0x76, 0x36, 0xa6, - 0xd4, 0x3d, 0x2c, 0xdf, 0x64, 0xeb, 0x1d, 0x75, 0xa4, 0xf4, 0x0a, 0x7f, 0x15, 0x02, 0x3d, 0xe7, - 0x3a, 0x2e, 0x0b, 0xff, 0x97, 0xc2, 0xcd, 0x6b, 0xd1, 0xb9, 0x06, 0x9a, 0xd5, 0x2d, 0xc0, 0x07, - 0x60, 0x7e, 0x24, 0xe1, 0x6b, 0x0f, 0x70, 0x5b, 0xb1, 0xa9, 0x69, 0x95, 0x3c, 0xb2, 0x12, 0xe6, - 0x60, 0x55, 0xd2, 0xf7, 0x25, 0xa6, 0x43, 0xf8, 0x6a, 0xf5, 0x1b, 0xe2, 0x46, 0xdc, 0x99, 0x04, - 0x9c, 0xd2, 0xc0, 0x42, 0x0a, 0x7c, 0xa3, 0x3a, 0xca, 0x18, 0x16, 0xb2, 0xe5, 0x8e, 0xaa, 0x65, - 0xe8, 0x67, 0x0d, 0xbc, 0xf5, 0xc0, 0xf7, 0x53, 0xe2, 0x63, 0x46, 0x1e, 0x9e, 0xba, 0x7d, 0x1c, - 0xfb, 0xc4, 0xc6, 0x8c, 0x1c, 0xa4, 0x84, 0x2f, 0x19, 0xbe, 0x0d, 0xe6, 0xfa, 0x38, 0xeb, 0x2b, - 0x69, 0x97, 0x87, 0x85, 0xd1, 0x90, 0x0c, 0xdc, 0x8b, 0x6c, 0x11, 0x84, 0xf7, 0xc0, 0x3c, 0x4f, - 0x4e, 0xd5, 0x51, 0x5c, 0x19, 0x0d, 0x29, 0xdc, 0xc8, 0x96, 0x61, 0x71, 0x72, 0xf3, 0x5e, 0x14, - 0x30, 0xa7, 0x17, 0x52, 0xf7, 0x48, 0x28, 0x34, 0xfe, 0x62, 0x55, 0xa2, 0xfc, 0xe4, 0x0a, 0xd3, - 0xe2, 0xd6, 0xc4, 0x41, 0xbc, 0xd0, 0xc0, 0xfa, 0xcc, 0xbe, 0x9f, 0xf0, 0xa6, 0x7f, 0xd4, 0x40, - 0x9b, 0x28, 0xa7, 0x93, 0x0a, 0x35, 0xf3, 0x24, 0x24, 0x99, 0xae, 0xcd, 0x5e, 0x67, 0x15, 0xe0, - 0x90, 0x67, 0x5a, 0x1f, 0xab, 0x75, 0x6e, 0x96, 0x37, 0x63, 0x1a, 0x8c, 0x3f, 0x37, 0x70, 0xaa, - 0x32, 0xb3, 0x21, 0x99, 0xf2, 0xfd, 0xd7, 0x05, 0x4d, 0x0c, 0xf9, 0x8b, 0x06, 0x5a, 0x53, 0x04, - 0x1c, 0xab, 0xfa, 0x5e, 0xac, 0xbc, 0xee, 0x44, 0x1d, 0x81, 0xa5, 0xb1, 0xb6, 0x15, 0xf7, 0xa3, - 0x6b, 0xdf, 0xce, 0xf6, 0x8c, 0x1d, 0x20, 0xbb, 0x59, 0x1d, 0x73, 0xbc, 0x71, 0xeb, 0xf1, 0xf9, - 0x9f, 0x9d, 0xda, 0xf9, 0x45, 0x47, 0x7b, 0x79, 0xd1, 0xd1, 0xfe, 0xb8, 0xe8, 0x68, 0xcf, 0x2f, - 0x3b, 0xb5, 0x97, 0x97, 0x9d, 0xda, 0x6f, 0x97, 0x9d, 0xda, 0x53, 0xb3, 0xc2, 0xbc, 0x27, 0x28, - 0xf7, 0x68, 0xcc, 0x5f, 0x72, 0x96, 0x75, 0xc5, 0x27, 0xda, 0x69, 0xf9, 0x91, 0x26, 0xba, 0xe8, - 0x2d, 0x88, 0x9b, 0xfb, 0xc1, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x5f, 0x7d, 0x21, 0xa6, 0xc0, - 0x09, 0x00, 0x00, -} - -func (this *Params) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Params) - if !ok { - that2, ok := that.(Params) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.VotePeriod != that1.VotePeriod { - return false - } - if !this.VoteThreshold.Equal(that1.VoteThreshold) { - return false - } - if !this.RewardBand.Equal(that1.RewardBand) { - return false - } - if this.RewardDistributionWindow != that1.RewardDistributionWindow { - return false - } - if len(this.Whitelist) != len(that1.Whitelist) { - return false - } - for i := range this.Whitelist { - if !this.Whitelist[i].Equal(&that1.Whitelist[i]) { - return false - } - } - if !this.SlashFraction.Equal(that1.SlashFraction) { - return false - } - if this.SlashWindow != that1.SlashWindow { - return false - } - if !this.MinValidPerWindow.Equal(that1.MinValidPerWindow) { - return false - } - if len(this.TwapTrackingList) != len(that1.TwapTrackingList) { - return false - } - for i := range this.TwapTrackingList { - if !this.TwapTrackingList[i].Equal(&that1.TwapTrackingList[i]) { - return false - } - } - if this.TwapDuration != that1.TwapDuration { - return false - } - return true -} -func (m *Params) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Params) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - n1, err1 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.TwapDuration, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.TwapDuration):]) - if err1 != nil { - return 0, err1 - } - i -= n1 - i = encodeVarintOracle(dAtA, i, uint64(n1)) - i-- - dAtA[i] = 0x52 - if len(m.TwapTrackingList) > 0 { - for iNdEx := len(m.TwapTrackingList) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.TwapTrackingList[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintOracle(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x4a - } - } - { - size := m.MinValidPerWindow.Size() - i -= size - if _, err := m.MinValidPerWindow.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintOracle(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x42 - if m.SlashWindow != 0 { - i = encodeVarintOracle(dAtA, i, uint64(m.SlashWindow)) - i-- - dAtA[i] = 0x38 - } - { - size := m.SlashFraction.Size() - i -= size - if _, err := m.SlashFraction.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintOracle(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - if len(m.Whitelist) > 0 { - for iNdEx := len(m.Whitelist) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Whitelist[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintOracle(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - } - if m.RewardDistributionWindow != 0 { - i = encodeVarintOracle(dAtA, i, uint64(m.RewardDistributionWindow)) - i-- - dAtA[i] = 0x20 - } - { - size := m.RewardBand.Size() - i -= size - if _, err := m.RewardBand.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintOracle(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size := m.VoteThreshold.Size() - i -= size - if _, err := m.VoteThreshold.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintOracle(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if m.VotePeriod != 0 { - i = encodeVarintOracle(dAtA, i, uint64(m.VotePeriod)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *Denom) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Denom) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Denom) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Exponent != 0 { - i = encodeVarintOracle(dAtA, i, uint64(m.Exponent)) - i-- - dAtA[i] = 0x18 - } - if len(m.SymbolDenom) > 0 { - i -= len(m.SymbolDenom) - copy(dAtA[i:], m.SymbolDenom) - i = encodeVarintOracle(dAtA, i, uint64(len(m.SymbolDenom))) - i-- - dAtA[i] = 0x12 - } - if len(m.BaseDenom) > 0 { - i -= len(m.BaseDenom) - copy(dAtA[i:], m.BaseDenom) - i = encodeVarintOracle(dAtA, i, uint64(len(m.BaseDenom))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *PriceHistoryEntry) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *PriceHistoryEntry) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PriceHistoryEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - n2, err2 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.PriceUpdateTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.PriceUpdateTime):]) - if err2 != nil { - return 0, err2 - } - i -= n2 - i = encodeVarintOracle(dAtA, i, uint64(n2)) - i-- - dAtA[i] = 0x1a - if m.VotePeriodCount != 0 { - i = encodeVarintOracle(dAtA, i, uint64(m.VotePeriodCount)) - i-- - dAtA[i] = 0x10 - } - { - size := m.Price.Size() - i -= size - if _, err := m.Price.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintOracle(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *PriceHistory) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *PriceHistory) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PriceHistory) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.PriceHistoryEntry) > 0 { - for iNdEx := len(m.PriceHistoryEntry) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.PriceHistoryEntry[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintOracle(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - { - size, err := m.Denom.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintOracle(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *AggregateExchangeRatePrevote) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *AggregateExchangeRatePrevote) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *AggregateExchangeRatePrevote) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.SubmitBlock != 0 { - i = encodeVarintOracle(dAtA, i, uint64(m.SubmitBlock)) - i-- - dAtA[i] = 0x18 - } - if len(m.Voter) > 0 { - i -= len(m.Voter) - copy(dAtA[i:], m.Voter) - i = encodeVarintOracle(dAtA, i, uint64(len(m.Voter))) - i-- - dAtA[i] = 0x12 - } - if len(m.Hash) > 0 { - i -= len(m.Hash) - copy(dAtA[i:], m.Hash) - i = encodeVarintOracle(dAtA, i, uint64(len(m.Hash))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *AggregateExchangeRateVote) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *AggregateExchangeRateVote) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *AggregateExchangeRateVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Voter) > 0 { - i -= len(m.Voter) - copy(dAtA[i:], m.Voter) - i = encodeVarintOracle(dAtA, i, uint64(len(m.Voter))) - i-- - dAtA[i] = 0x12 - } - if len(m.ExchangeRateTuples) > 0 { - for iNdEx := len(m.ExchangeRateTuples) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.ExchangeRateTuples[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintOracle(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *ExchangeRateTuple) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ExchangeRateTuple) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ExchangeRateTuple) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.ExchangeRate.Size() - i -= size - if _, err := m.ExchangeRate.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintOracle(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if len(m.Denom) > 0 { - i -= len(m.Denom) - copy(dAtA[i:], m.Denom) - i = encodeVarintOracle(dAtA, i, uint64(len(m.Denom))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintOracle(dAtA []byte, offset int, v uint64) int { - offset -= sovOracle(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *Params) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.VotePeriod != 0 { - n += 1 + sovOracle(uint64(m.VotePeriod)) - } - l = m.VoteThreshold.Size() - n += 1 + l + sovOracle(uint64(l)) - l = m.RewardBand.Size() - n += 1 + l + sovOracle(uint64(l)) - if m.RewardDistributionWindow != 0 { - n += 1 + sovOracle(uint64(m.RewardDistributionWindow)) - } - if len(m.Whitelist) > 0 { - for _, e := range m.Whitelist { - l = e.Size() - n += 1 + l + sovOracle(uint64(l)) - } - } - l = m.SlashFraction.Size() - n += 1 + l + sovOracle(uint64(l)) - if m.SlashWindow != 0 { - n += 1 + sovOracle(uint64(m.SlashWindow)) - } - l = m.MinValidPerWindow.Size() - n += 1 + l + sovOracle(uint64(l)) - if len(m.TwapTrackingList) > 0 { - for _, e := range m.TwapTrackingList { - l = e.Size() - n += 1 + l + sovOracle(uint64(l)) - } - } - l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.TwapDuration) - n += 1 + l + sovOracle(uint64(l)) - return n -} - -func (m *Denom) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.BaseDenom) - if l > 0 { - n += 1 + l + sovOracle(uint64(l)) - } - l = len(m.SymbolDenom) - if l > 0 { - n += 1 + l + sovOracle(uint64(l)) - } - if m.Exponent != 0 { - n += 1 + sovOracle(uint64(m.Exponent)) - } - return n -} - -func (m *PriceHistoryEntry) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Price.Size() - n += 1 + l + sovOracle(uint64(l)) - if m.VotePeriodCount != 0 { - n += 1 + sovOracle(uint64(m.VotePeriodCount)) - } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.PriceUpdateTime) - n += 1 + l + sovOracle(uint64(l)) - return n -} - -func (m *PriceHistory) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Denom.Size() - n += 1 + l + sovOracle(uint64(l)) - if len(m.PriceHistoryEntry) > 0 { - for _, e := range m.PriceHistoryEntry { - l = e.Size() - n += 1 + l + sovOracle(uint64(l)) - } - } - return n -} - -func (m *AggregateExchangeRatePrevote) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Hash) - if l > 0 { - n += 1 + l + sovOracle(uint64(l)) - } - l = len(m.Voter) - if l > 0 { - n += 1 + l + sovOracle(uint64(l)) - } - if m.SubmitBlock != 0 { - n += 1 + sovOracle(uint64(m.SubmitBlock)) - } - return n -} - -func (m *AggregateExchangeRateVote) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.ExchangeRateTuples) > 0 { - for _, e := range m.ExchangeRateTuples { - l = e.Size() - n += 1 + l + sovOracle(uint64(l)) - } - } - l = len(m.Voter) - if l > 0 { - n += 1 + l + sovOracle(uint64(l)) - } - return n -} - -func (m *ExchangeRateTuple) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Denom) - if l > 0 { - n += 1 + l + sovOracle(uint64(l)) - } - l = m.ExchangeRate.Size() - n += 1 + l + sovOracle(uint64(l)) - return n -} - -func sovOracle(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozOracle(x uint64) (n int) { - return sovOracle(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *Params) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Params: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Params: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field VotePeriod", wireType) - } - m.VotePeriod = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.VotePeriod |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field VoteThreshold", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.VoteThreshold.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RewardBand", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.RewardBand.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field RewardDistributionWindow", wireType) - } - m.RewardDistributionWindow = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.RewardDistributionWindow |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Whitelist", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Whitelist = append(m.Whitelist, Denom{}) - if err := m.Whitelist[len(m.Whitelist)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SlashFraction", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.SlashFraction.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 7: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field SlashWindow", wireType) - } - m.SlashWindow = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.SlashWindow |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MinValidPerWindow", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.MinValidPerWindow.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TwapTrackingList", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TwapTrackingList = append(m.TwapTrackingList, Denom{}) - if err := m.TwapTrackingList[len(m.TwapTrackingList)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 10: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TwapDuration", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.TwapDuration, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipOracle(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthOracle - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Denom) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Denom: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Denom: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BaseDenom", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.BaseDenom = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SymbolDenom", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SymbolDenom = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Exponent", wireType) - } - m.Exponent = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Exponent |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipOracle(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthOracle - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *PriceHistoryEntry) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: PriceHistoryEntry: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PriceHistoryEntry: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Price", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Price.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field VotePeriodCount", wireType) - } - m.VotePeriodCount = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.VotePeriodCount |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PriceUpdateTime", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.PriceUpdateTime, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipOracle(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthOracle - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *PriceHistory) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: PriceHistory: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PriceHistory: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Denom", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Denom.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PriceHistoryEntry", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.PriceHistoryEntry = append(m.PriceHistoryEntry, PriceHistoryEntry{}) - if err := m.PriceHistoryEntry[len(m.PriceHistoryEntry)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipOracle(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthOracle - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *AggregateExchangeRatePrevote) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: AggregateExchangeRatePrevote: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: AggregateExchangeRatePrevote: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Hash", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Hash = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Voter", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Voter = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field SubmitBlock", wireType) - } - m.SubmitBlock = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.SubmitBlock |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipOracle(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthOracle - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *AggregateExchangeRateVote) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: AggregateExchangeRateVote: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: AggregateExchangeRateVote: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExchangeRateTuples", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ExchangeRateTuples = append(m.ExchangeRateTuples, ExchangeRateTuple{}) - if err := m.ExchangeRateTuples[len(m.ExchangeRateTuples)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Voter", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Voter = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipOracle(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthOracle - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ExchangeRateTuple) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ExchangeRateTuple: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ExchangeRateTuple: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Denom", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Denom = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExchangeRate", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOracle - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthOracle - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOracle - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ExchangeRate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipOracle(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthOracle - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipOracle(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowOracle - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowOracle - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowOracle - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthOracle - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupOracle - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthOracle - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthOracle = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowOracle = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupOracle = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/oracle/types/params.go b/x/oracle/types/params.go deleted file mode 100644 index 88f7bd712..000000000 --- a/x/oracle/types/params.go +++ /dev/null @@ -1,334 +0,0 @@ -package types - -import ( - "fmt" - time "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" - "gopkg.in/yaml.v3" -) - -// Parameter keys -var ( - KeyVotePeriod = []byte("VotePeriod") - KeyVoteThreshold = []byte("VoteThreshold") - KeyRewardBand = []byte("RewardBand") - KeyRewardDistributionWindow = []byte("RewardDistributionWindow") - KeyWhitelist = []byte("Whitelist") - KeySlashFraction = []byte("SlashFraction") - KeySlashWindow = []byte("SlashWindow") - KeyMinValidPerWindow = []byte("MinValidPerWindow") - KeyTwapTrackingList = []byte("TwapTrackingList") - KeyTwapDuration = []byte("TwapDuration") -) - -// Default parameter values -const ( - DefaultVotePeriod = BlocksPerMinute / 2 // 30 seconds - DefaultSlashWindow = BlocksPerWeek // window for a week - DefaultRewardDistributionWindow = BlocksPerYear // window for a year -) - -// Default parameter values -var ( - DefaultVoteThreshold = sdk.NewDecWithPrec(50, 2) // 50% - DefaultRewardBand = sdk.NewDecWithPrec(2, 2) // 2% (-1, 1) - DefaultWhitelist = DenomList{ - { - BaseDenom: JunoDenom, - SymbolDenom: JunoSymbol, - Exponent: JunoExponent, - }, - { - BaseDenom: AtomDenom, - SymbolDenom: AtomSymbol, - Exponent: AtomExponent, - }, - } - DefaultSlashFraction = sdk.NewDecWithPrec(1, 4) // 0.01% - DefaultMinValidPerWindow = sdk.NewDecWithPrec(5, 2) // 5% - DefaultTwapDuration = time.Hour * 24 * 7 // 7 days -) - -var _ paramstypes.ParamSet = &Params{} - -// DefaultParams creates default oracle module parameters -func DefaultParams() Params { - return Params{ - VotePeriod: DefaultVotePeriod, - VoteThreshold: DefaultVoteThreshold, - RewardBand: DefaultRewardBand, - RewardDistributionWindow: DefaultRewardDistributionWindow, - Whitelist: DefaultWhitelist, - SlashFraction: DefaultSlashFraction, - SlashWindow: DefaultSlashWindow, - MinValidPerWindow: DefaultMinValidPerWindow, - TwapTrackingList: DefaultWhitelist, - TwapDuration: DefaultTwapDuration, - } -} - -// ParamKeyTable returns the parameter key table. -func ParamKeyTable() paramstypes.KeyTable { - return paramstypes.NewKeyTable().RegisterParamSet(&Params{}) -} - -// ParamSetPairs implements the ParamSet interface and returns all the key/value pairs -// pairs of oracle module's parameters. -func (p *Params) ParamSetPairs() paramstypes.ParamSetPairs { - return paramstypes.ParamSetPairs{ - paramstypes.NewParamSetPair( - KeyVotePeriod, - &p.VotePeriod, - validateVotePeriod, - ), - paramstypes.NewParamSetPair( - KeyVoteThreshold, - &p.VoteThreshold, - validateVoteThreshold, - ), - paramstypes.NewParamSetPair( - KeyRewardBand, - &p.RewardBand, - validateRewardBand, - ), - paramstypes.NewParamSetPair( - KeyRewardDistributionWindow, - &p.RewardDistributionWindow, - validateRewardDistributionWindow, - ), - paramstypes.NewParamSetPair( - KeyWhitelist, - &p.Whitelist, - validateWhitelist, - ), - paramstypes.NewParamSetPair( - KeySlashFraction, - &p.SlashFraction, - validateSlashFraction, - ), - paramstypes.NewParamSetPair( - KeySlashWindow, - &p.SlashWindow, - validateSlashWindow, - ), - paramstypes.NewParamSetPair( - KeyMinValidPerWindow, - &p.MinValidPerWindow, - validateMinValidPerWindow, - ), - paramstypes.NewParamSetPair( - KeyTwapTrackingList, - &p.TwapTrackingList, - validateTrackingList, - ), - paramstypes.NewParamSetPair( - KeyTwapDuration, - &p.TwapDuration, - validateTrackingDuration, - ), - } -} - -// String implements fmt.Stringer interface -func (p Params) String() string { - out, _ := yaml.Marshal(p) - return string(out) -} - -// Validate performs basic validation on oracle parameters. -func (p Params) Validate() error { - if p.VotePeriod == 0 { - return fmt.Errorf("oracle parameter VotePeriod must be > 0, is %d", p.VotePeriod) - } - if p.VoteThreshold.LTE(sdk.NewDecWithPrec(33, 2)) { - return fmt.Errorf("oracle parameter VoteThreshold must be greater than 33 percent") - } - - if p.RewardBand.GT(sdk.OneDec()) || p.RewardBand.IsNegative() { - return fmt.Errorf("oracle parameter RewardBand must be between [0, 1]") - } - - if p.RewardDistributionWindow < p.VotePeriod { - return fmt.Errorf("oracle parameter RewardDistributionWindow must be greater than or equal with VotePeriod") - } - - if p.SlashFraction.GT(sdk.OneDec()) || p.SlashFraction.IsNegative() { - return fmt.Errorf("oracle parameter SlashFraction must be between [0, 1]") - } - - if p.SlashWindow < p.VotePeriod { - return fmt.Errorf("oracle parameter SlashWindow must be greater than or equal with VotePeriod") - } - - if p.MinValidPerWindow.GT(sdk.OneDec()) || p.MinValidPerWindow.IsNegative() { - return fmt.Errorf("oracle parameter MinValidPerWindow must be between [0, 1]") - } - - for _, denom := range p.Whitelist { - if len(denom.BaseDenom) == 0 { - return fmt.Errorf("oracle parameter Whitelist Denom must have BaseDenom") - } - if len(denom.SymbolDenom) == 0 { - return fmt.Errorf("oracle parameter Whitelist Denom must have SymbolDenom") - } - } - return nil -} - -func validateTrackingList(i interface{}) error { - v, ok := i.(DenomList) - if !ok { - return fmt.Errorf("invalid parameter type: %T", i) - } - - for _, d := range v { - if len(d.BaseDenom) == 0 { - return fmt.Errorf("oracle parameter Whitelist Denom must have BaseDenom") - } - if len(d.SymbolDenom) == 0 { - return fmt.Errorf("oracle parameter Whitelist Denom must have SymbolDenom") - } - } - - return nil -} - -func validateTrackingDuration(i interface{}) error { - v, ok := i.(time.Duration) - if !ok { - return fmt.Errorf("invalid parameter type: %T", i) - } - - if v == 0 { - return fmt.Errorf("tracking duration must be positive: %d", v) - } - - return nil -} - -func validateVotePeriod(i interface{}) error { - v, ok := i.(uint64) - if !ok { - return fmt.Errorf("invalid parameter type: %T", i) - } - - if v == 0 { - return fmt.Errorf("vote period must be positive: %d", v) - } - - return nil -} - -func validateVoteThreshold(i interface{}) error { - v, ok := i.(sdk.Dec) - if !ok { - return fmt.Errorf("invalid parameter type: %T", i) - } - - if v.LT(sdk.NewDecWithPrec(33, 2)) { - return fmt.Errorf("vote threshold must be bigger than 33%%: %s", v) - } - - if v.GT(sdk.OneDec()) { - return fmt.Errorf("vote threshold too large: %s", v) - } - - return nil -} - -func validateRewardBand(i interface{}) error { - v, ok := i.(sdk.Dec) - if !ok { - return fmt.Errorf("invalid parameter type: %T", i) - } - - if v.IsNegative() { - return fmt.Errorf("reward band must be positive: %s", v) - } - - if v.GT(sdk.OneDec()) { - return fmt.Errorf("reward band is too large: %s", v) - } - - return nil -} - -func validateRewardDistributionWindow(i interface{}) error { - v, ok := i.(uint64) - if !ok { - return fmt.Errorf("invalid parameter type: %T", i) - } - - if v == 0 { - return fmt.Errorf("reward distribution window must be positive: %d", v) - } - - return nil -} - -func validateWhitelist(i interface{}) error { - v, ok := i.(DenomList) - if !ok { - return fmt.Errorf("invalid parameter type: %T", i) - } - - for _, d := range v { - if len(d.BaseDenom) == 0 { - return fmt.Errorf("oracle parameter Whitelist Denom must have BaseDenom") - } - if len(d.SymbolDenom) == 0 { - return fmt.Errorf("oracle parameter Whitelist Denom must have SymbolDenom") - } - } - - return nil -} - -func validateSlashFraction(i interface{}) error { - v, ok := i.(sdk.Dec) - if !ok { - return fmt.Errorf("invalid parameter type: %T", i) - } - - if v.IsNegative() { - return fmt.Errorf("slash fraction must be positive: %s", v) - } - - if v.GT(sdk.OneDec()) { - return fmt.Errorf("slash fraction is too large: %s", v) - } - - return nil -} - -func validateSlashWindow(i interface{}) error { - v, ok := i.(uint64) - if !ok { - return fmt.Errorf("invalid parameter type: %T", i) - } - - if v == 0 { - return fmt.Errorf("slash window must be positive: %d", v) - } - - return nil -} - -func validateMinValidPerWindow(i interface{}) error { - v, ok := i.(sdk.Dec) - if !ok { - return fmt.Errorf("invalid parameter type: %T", i) - } - - if v.IsNegative() { - return fmt.Errorf("min valid per window must be positive: %s", v) - } - - if v.GT(sdk.OneDec()) { - return fmt.Errorf("min valid per window is too large: %s", v) - } - - return nil -} diff --git a/x/oracle/types/params_test.go b/x/oracle/types/params_test.go deleted file mode 100644 index 4044a3523..000000000 --- a/x/oracle/types/params_test.go +++ /dev/null @@ -1,187 +0,0 @@ -package types - -import ( - "testing" - - "github.com/stretchr/testify/require" - - sdk "github.com/cosmos/cosmos-sdk/types" -) - -func TestParamKeyTable(t *testing.T) { - require.NotNil(t, ParamKeyTable()) -} - -func TestValidateVotePeriod(t *testing.T) { - err := validateVotePeriod("invalidUint64") - require.ErrorContains(t, err, "invalid parameter type: string") - - err = validateVotePeriod(uint64(0)) - require.ErrorContains(t, err, "vote period must be positive: 0") - - err = validateVotePeriod(uint64(10)) - require.Nil(t, err) -} - -func TestValidateVoteThreshold(t *testing.T) { - err := validateVoteThreshold("invalidSdkType") - require.ErrorContains(t, err, "invalid parameter type: string") - - err = validateVoteThreshold(sdk.MustNewDecFromStr("0.31")) - require.ErrorContains(t, err, "vote threshold must be bigger than 33%: 0.310000000000000000") - - err = validateVoteThreshold(sdk.MustNewDecFromStr("40.0")) - require.ErrorContains(t, err, "vote threshold too large: 40.000000000000000000") - - err = validateVoteThreshold(sdk.MustNewDecFromStr("0.35")) - require.Nil(t, err) -} - -func TestValidateRewardBand(t *testing.T) { - err := validateRewardBand("invalidSdkType") - require.ErrorContains(t, err, "invalid parameter type: string") - - err = validateRewardBand(sdk.MustNewDecFromStr("-0.31")) - require.ErrorContains(t, err, "reward band must be positive: -0.310000000000000000") - - err = validateRewardBand(sdk.MustNewDecFromStr("40.0")) - require.ErrorContains(t, err, "reward band is too large: 40.000000000000000000") - - err = validateRewardBand(sdk.OneDec()) - require.Nil(t, err) -} - -func TestValidateRewardDistributionWindow(t *testing.T) { - err := validateRewardDistributionWindow("invalidUint64") - require.ErrorContains(t, err, "invalid parameter type: string") - - err = validateRewardDistributionWindow(uint64(0)) - require.ErrorContains(t, err, "reward distribution window must be positive: 0") - - err = validateRewardDistributionWindow(uint64(10)) - require.Nil(t, err) -} - -func TestValidateWhitelist(t *testing.T) { - err := validateWhitelist("invalidUint64") - require.ErrorContains(t, err, "invalid parameter type: string") - - err = validateWhitelist(DenomList{ - {BaseDenom: ""}, - }) - require.ErrorContains(t, err, "oracle parameter Whitelist Denom must have BaseDenom") - - err = validateWhitelist(DenomList{ - {BaseDenom: DenomJuno.BaseDenom, SymbolDenom: ""}, - }) - require.ErrorContains(t, err, "oracle parameter Whitelist Denom must have SymbolDenom") - - err = validateWhitelist(DenomList{ - {BaseDenom: DenomJuno.BaseDenom, SymbolDenom: DenomJuno.SymbolDenom}, - }) - require.Nil(t, err) -} - -func TestValidateSlashFraction(t *testing.T) { - err := validateSlashFraction("invalidSdkType") - require.ErrorContains(t, err, "invalid parameter type: string") - - err = validateSlashFraction(sdk.MustNewDecFromStr("-0.31")) - require.ErrorContains(t, err, "slash fraction must be positive: -0.310000000000000000") - - err = validateSlashFraction(sdk.MustNewDecFromStr("40.0")) - require.ErrorContains(t, err, "slash fraction is too large: 40.000000000000000000") - - err = validateSlashFraction(sdk.OneDec()) - require.Nil(t, err) -} - -func TestValidateSlashWindow(t *testing.T) { - err := validateSlashWindow("invalidUint64") - require.ErrorContains(t, err, "invalid parameter type: string") - - err = validateSlashWindow(uint64(0)) - require.ErrorContains(t, err, "slash window must be positive: 0") - - err = validateSlashWindow(uint64(10)) - require.Nil(t, err) -} - -func TestValidateMinValidPerWindow(t *testing.T) { - err := validateMinValidPerWindow("invalidSdkType") - require.ErrorContains(t, err, "invalid parameter type: string") - - err = validateMinValidPerWindow(sdk.MustNewDecFromStr("-0.31")) - require.ErrorContains(t, err, "min valid per window must be positive: -0.310000000000000000") - - err = validateMinValidPerWindow(sdk.MustNewDecFromStr("40.0")) - require.ErrorContains(t, err, "min valid per window is too large: 40.000000000000000000") - - err = validateMinValidPerWindow(sdk.OneDec()) - require.Nil(t, err) -} - -func TestParamsEqual(t *testing.T) { - p1 := DefaultParams() - err := p1.Validate() - require.NoError(t, err) - - // minus vote period - p1.VotePeriod = 0 - err = p1.Validate() - require.Error(t, err) - - // small vote threshold - p2 := DefaultParams() - p2.VoteThreshold = sdk.ZeroDec() - err = p2.Validate() - require.Error(t, err) - - // negative reward band - p3 := DefaultParams() - p3.RewardBand = sdk.NewDecWithPrec(-1, 2) - err = p3.Validate() - require.Error(t, err) - - // negative slash fraction - p4 := DefaultParams() - p4.SlashFraction = sdk.NewDec(-1) - err = p4.Validate() - require.Error(t, err) - - // negative min valid per window - p5 := DefaultParams() - p5.MinValidPerWindow = sdk.NewDec(-1) - err = p5.Validate() - require.Error(t, err) - - // small slash window - p6 := DefaultParams() - p6.SlashWindow = 0 - err = p6.Validate() - require.Error(t, err) - - // small distribution window - p7 := DefaultParams() - p7.RewardDistributionWindow = 0 - err = p7.Validate() - require.Error(t, err) - - // empty name - p9 := DefaultParams() - p9.Whitelist[0].BaseDenom = "" - p9.Whitelist[0].SymbolDenom = "ATOM" - err = p9.Validate() - require.Error(t, err) - - // empty - p10 := DefaultParams() - p10.Whitelist[0].BaseDenom = "uatom" - p10.Whitelist[0].SymbolDenom = "" - err = p10.Validate() - require.Error(t, err) - - p11 := DefaultParams() - require.NotNil(t, p11.ParamSetPairs()) - require.NotNil(t, p11.String()) -} diff --git a/x/oracle/types/proposal.go b/x/oracle/types/proposal.go deleted file mode 100644 index b01b4d0ef..000000000 --- a/x/oracle/types/proposal.go +++ /dev/null @@ -1,173 +0,0 @@ -package types - -import ( - "fmt" - "strings" - - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" -) - -type ProposalType string - -const ( - ProposalTypeAddTrackingPriceHistory ProposalType = "AddTrackingPriceHistory" - ProposalTypeAddTrackingPriceHistoryWithWhitelist ProposalType = "AddTrackingPriceHistoryWithWhitelist" - ProposalTypeRemoveTrackingPriceHistoryProposal ProposalType = "RemoveTrackingPriceHistoryProposal" -) - -func init() { - govtypes.RegisterProposalType(string(ProposalTypeAddTrackingPriceHistory)) - govtypes.RegisterProposalType(string(ProposalTypeAddTrackingPriceHistoryWithWhitelist)) - govtypes.RegisterProposalTypeCodec(&AddTrackingPriceHistoryProposal{}, "juno/oracle/AddTrackingPriceHistoryProposal") - govtypes.RegisterProposalTypeCodec(&AddTrackingPriceHistoryWithWhitelistProposal{}, "juno/oracle/AddTrackingPriceHistoryWithWhitelistProposal") - govtypes.RegisterProposalTypeCodec(&RemoveTrackingPriceHistoryProposal{}, "juno/oracle/RemoveTrackingPriceHistoryProposal") -} - -func NewAddTrackingPriceHistoryProposal( - title string, - description string, - list DenomList, -) *AddTrackingPriceHistoryProposal { - return &AddTrackingPriceHistoryProposal{title, description, list} -} - -// ProposalRoute returns the routing key of a parameter change proposal. -func (p AddTrackingPriceHistoryProposal) ProposalRoute() string { return RouterKey } - -// GetTitle returns the title of the proposal -func (p *AddTrackingPriceHistoryProposal) GetTitle() string { return p.Title } - -// GetDescription returns the human readable description of the proposal -func (p AddTrackingPriceHistoryProposal) GetDescription() string { return p.Description } - -// ProposalType returns the type -func (p AddTrackingPriceHistoryProposal) ProposalType() string { - return string(ProposalTypeAddTrackingPriceHistory) -} - -// ValidateBasic validates the proposal -func (p AddTrackingPriceHistoryProposal) ValidateBasic() error { - if err := validateProposalCommons(p.Title, p.Description); err != nil { - return err - } - if len(p.TrackingList) == 0 { - return sdkerrors.Wrap(ErrEmpty, "code updates") - } - return nil -} - -// String implements the Stringer interface. -func (p AddTrackingPriceHistoryProposal) String() string { - return fmt.Sprintf(`AddTrackingPriceHistoryProposal: - Title: %s - Description : %s - TrackingList: %v - `, p.Title, p.Description, p.TrackingList) -} - -func NewAddTrackingPriceHistoryWithWhitelistProposal( - title string, - description string, - list DenomList, -) *AddTrackingPriceHistoryWithWhitelistProposal { - return &AddTrackingPriceHistoryWithWhitelistProposal{title, description, list} -} - -// ProposalRoute returns the routing key of a parameter change proposal. -func (p AddTrackingPriceHistoryWithWhitelistProposal) ProposalRoute() string { return RouterKey } - -// GetTitle returns the title of the proposal -func (p *AddTrackingPriceHistoryWithWhitelistProposal) GetTitle() string { return p.Title } - -// GetDescription returns the human readable description of the proposal -func (p AddTrackingPriceHistoryWithWhitelistProposal) GetDescription() string { return p.Description } - -// ProposalType returns the type -func (p AddTrackingPriceHistoryWithWhitelistProposal) ProposalType() string { - return string(ProposalTypeAddTrackingPriceHistoryWithWhitelist) -} - -// ValidateBasic validates the proposal -func (p AddTrackingPriceHistoryWithWhitelistProposal) ValidateBasic() error { - if err := validateProposalCommons(p.Title, p.Description); err != nil { - return err - } - if len(p.TrackingList) == 0 { - return sdkerrors.Wrap(ErrEmpty, "code updates") - } - return nil -} - -// String implements the Stringer interface. -func (p AddTrackingPriceHistoryWithWhitelistProposal) String() string { - return fmt.Sprintf(`AddTrackingPriceHistoryWithWhitelistProposal: - Title: %s - Description : %s - TrackingList: %v - `, p.Title, p.Description, p.TrackingList) -} - -func NewRemoveTrackingPriceHistoryProposal( - title string, - description string, - list DenomList, -) *RemoveTrackingPriceHistoryProposal { - return &RemoveTrackingPriceHistoryProposal{title, description, list} -} - -// ProposalRoute returns the routing key of a parameter change proposal. -func (p RemoveTrackingPriceHistoryProposal) ProposalRoute() string { return RouterKey } - -// GetTitle returns the title of the proposal -func (p *RemoveTrackingPriceHistoryProposal) GetTitle() string { return p.Title } - -// GetDescription returns the human readable description of the proposal -func (p RemoveTrackingPriceHistoryProposal) GetDescription() string { return p.Description } - -// ProposalType returns the type -func (p RemoveTrackingPriceHistoryProposal) ProposalType() string { - return string(ProposalTypeRemoveTrackingPriceHistoryProposal) -} - -// ValidateBasic validates the proposal -func (p RemoveTrackingPriceHistoryProposal) ValidateBasic() error { - if err := validateProposalCommons(p.Title, p.Description); err != nil { - return err - } - if len(p.RemoveTwapList) == 0 { - return sdkerrors.Wrap(ErrEmpty, "code updates") - } - return nil -} - -// String implements the Stringer interface. -func (p RemoveTrackingPriceHistoryProposal) String() string { - return fmt.Sprintf(`RemoveTrackingPriceHistoryProposal: - Title: %s - Description : %s - RemoveTrackingList: %v - `, p.Title, p.Description, p.RemoveTwapList) -} - -func validateProposalCommons(title, description string) error { - if strings.TrimSpace(title) != title { - return sdkerrors.Wrap(govtypes.ErrInvalidProposalContent, "proposal title must not start/end with white spaces") - } - if len(title) == 0 { - return sdkerrors.Wrap(govtypes.ErrInvalidProposalContent, "proposal title cannot be blank") - } - if len(title) > govtypes.MaxTitleLength { - return sdkerrors.Wrapf(govtypes.ErrInvalidProposalContent, "proposal title is longer than max length of %d", govtypes.MaxTitleLength) - } - if strings.TrimSpace(description) != description { - return sdkerrors.Wrap(govtypes.ErrInvalidProposalContent, "proposal description must not start/end with white spaces") - } - if len(description) == 0 { - return sdkerrors.Wrap(govtypes.ErrInvalidProposalContent, "proposal description cannot be blank") - } - if len(description) > govtypes.MaxDescriptionLength { - return sdkerrors.Wrapf(govtypes.ErrInvalidProposalContent, "proposal description is longer than max length of %d", govtypes.MaxDescriptionLength) - } - return nil -} diff --git a/x/oracle/types/proposal.pb.go b/x/oracle/types/proposal.pb.go deleted file mode 100644 index 38c1872b9..000000000 --- a/x/oracle/types/proposal.pb.go +++ /dev/null @@ -1,1065 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: juno/oracle/v1/proposal.proto - -package types - -import ( - fmt "fmt" - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/gogo/protobuf/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// AddTrackingPriceHistoryProposal add denom to tracking price history list (in -// this situation, denom must already in Whitelist) -type AddTrackingPriceHistoryProposal struct { - // Title is a short summary - Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` - // Description is a human readable text - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` - // Denom - TrackingList DenomList `protobuf:"bytes,3,rep,name=tracking_list,json=trackingList,proto3,castrepeated=DenomList" json:"tracking_list" yaml:"tracking_list"` -} - -func (m *AddTrackingPriceHistoryProposal) Reset() { *m = AddTrackingPriceHistoryProposal{} } -func (*AddTrackingPriceHistoryProposal) ProtoMessage() {} -func (*AddTrackingPriceHistoryProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_ad1480a45a4af575, []int{0} -} -func (m *AddTrackingPriceHistoryProposal) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *AddTrackingPriceHistoryProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_AddTrackingPriceHistoryProposal.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *AddTrackingPriceHistoryProposal) XXX_Merge(src proto.Message) { - xxx_messageInfo_AddTrackingPriceHistoryProposal.Merge(m, src) -} -func (m *AddTrackingPriceHistoryProposal) XXX_Size() int { - return m.Size() -} -func (m *AddTrackingPriceHistoryProposal) XXX_DiscardUnknown() { - xxx_messageInfo_AddTrackingPriceHistoryProposal.DiscardUnknown(m) -} - -var xxx_messageInfo_AddTrackingPriceHistoryProposal proto.InternalMessageInfo - -// AddTrackingPriceHistoryWithWhitelistProposal add denom to tracking price -// history list and whitelist (in this situation, denom don't have to in -// Whitelist) -type AddTrackingPriceHistoryWithWhitelistProposal struct { - // Title is a short summary - Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` - // Description is a human readable text - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` - // Denom - TrackingList DenomList `protobuf:"bytes,3,rep,name=tracking_list,json=trackingList,proto3,castrepeated=DenomList" json:"tracking_list" yaml:"tracking_list"` -} - -func (m *AddTrackingPriceHistoryWithWhitelistProposal) Reset() { - *m = AddTrackingPriceHistoryWithWhitelistProposal{} -} -func (*AddTrackingPriceHistoryWithWhitelistProposal) ProtoMessage() {} -func (*AddTrackingPriceHistoryWithWhitelistProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_ad1480a45a4af575, []int{1} -} -func (m *AddTrackingPriceHistoryWithWhitelistProposal) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *AddTrackingPriceHistoryWithWhitelistProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_AddTrackingPriceHistoryWithWhitelistProposal.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *AddTrackingPriceHistoryWithWhitelistProposal) XXX_Merge(src proto.Message) { - xxx_messageInfo_AddTrackingPriceHistoryWithWhitelistProposal.Merge(m, src) -} -func (m *AddTrackingPriceHistoryWithWhitelistProposal) XXX_Size() int { - return m.Size() -} -func (m *AddTrackingPriceHistoryWithWhitelistProposal) XXX_DiscardUnknown() { - xxx_messageInfo_AddTrackingPriceHistoryWithWhitelistProposal.DiscardUnknown(m) -} - -var xxx_messageInfo_AddTrackingPriceHistoryWithWhitelistProposal proto.InternalMessageInfo - -// RemoveTrackingPriceHistoryProposal remove denom from tracking price history -// list (in this situation, denom don't have to in Whitelist) -type RemoveTrackingPriceHistoryProposal struct { - // Title is a short summary - Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` - // Description is a human readable text - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` - // Denom - RemoveTwapList DenomList `protobuf:"bytes,3,rep,name=remove_twap_list,json=removeTwapList,proto3,castrepeated=DenomList" json:"remove_twap_list" yaml:"remove_tracking_list"` -} - -func (m *RemoveTrackingPriceHistoryProposal) Reset() { *m = RemoveTrackingPriceHistoryProposal{} } -func (*RemoveTrackingPriceHistoryProposal) ProtoMessage() {} -func (*RemoveTrackingPriceHistoryProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_ad1480a45a4af575, []int{2} -} -func (m *RemoveTrackingPriceHistoryProposal) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RemoveTrackingPriceHistoryProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RemoveTrackingPriceHistoryProposal.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *RemoveTrackingPriceHistoryProposal) XXX_Merge(src proto.Message) { - xxx_messageInfo_RemoveTrackingPriceHistoryProposal.Merge(m, src) -} -func (m *RemoveTrackingPriceHistoryProposal) XXX_Size() int { - return m.Size() -} -func (m *RemoveTrackingPriceHistoryProposal) XXX_DiscardUnknown() { - xxx_messageInfo_RemoveTrackingPriceHistoryProposal.DiscardUnknown(m) -} - -var xxx_messageInfo_RemoveTrackingPriceHistoryProposal proto.InternalMessageInfo - -func init() { - proto.RegisterType((*AddTrackingPriceHistoryProposal)(nil), "juno.oracle.v1.AddTrackingPriceHistoryProposal") - proto.RegisterType((*AddTrackingPriceHistoryWithWhitelistProposal)(nil), "juno.oracle.v1.AddTrackingPriceHistoryWithWhitelistProposal") - proto.RegisterType((*RemoveTrackingPriceHistoryProposal)(nil), "juno.oracle.v1.RemoveTrackingPriceHistoryProposal") -} - -func init() { proto.RegisterFile("juno/oracle/v1/proposal.proto", fileDescriptor_ad1480a45a4af575) } - -var fileDescriptor_ad1480a45a4af575 = []byte{ - // 373 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0xcd, 0x2a, 0xcd, 0xcb, - 0xd7, 0xcf, 0x2f, 0x4a, 0x4c, 0xce, 0x49, 0xd5, 0x2f, 0x33, 0xd4, 0x2f, 0x28, 0xca, 0x2f, 0xc8, - 0x2f, 0x4e, 0xcc, 0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x03, 0x49, 0xeb, 0x41, 0xa4, - 0xf5, 0xca, 0x0c, 0xa5, 0x44, 0xd2, 0xf3, 0xd3, 0xf3, 0xc1, 0x52, 0xfa, 0x20, 0x16, 0x44, 0x95, - 0x94, 0x34, 0x9a, 0x21, 0x50, 0xf5, 0x60, 0x49, 0xa5, 0x03, 0x8c, 0x5c, 0xf2, 0x8e, 0x29, 0x29, - 0x21, 0x45, 0x89, 0xc9, 0xd9, 0x99, 0x79, 0xe9, 0x01, 0x45, 0x99, 0xc9, 0xa9, 0x1e, 0x99, 0xc5, - 0x25, 0xf9, 0x45, 0x95, 0x01, 0x50, 0xcb, 0x84, 0x44, 0xb8, 0x58, 0x4b, 0x32, 0x4b, 0x72, 0x52, - 0x25, 0x18, 0x15, 0x18, 0x35, 0x38, 0x83, 0x20, 0x1c, 0x21, 0x05, 0x2e, 0xee, 0x94, 0xd4, 0xe2, - 0xe4, 0xa2, 0xcc, 0x82, 0x92, 0xcc, 0xfc, 0x3c, 0x09, 0x26, 0xb0, 0x1c, 0xb2, 0x90, 0x50, 0x2a, - 0x17, 0x6f, 0x09, 0xd4, 0xdc, 0xf8, 0x9c, 0xcc, 0xe2, 0x12, 0x09, 0x66, 0x05, 0x66, 0x0d, 0x6e, - 0x23, 0x51, 0x3d, 0x54, 0x67, 0xeb, 0xb9, 0xa4, 0xe6, 0xe5, 0xe7, 0x3a, 0x69, 0x9e, 0xb8, 0x27, - 0xcf, 0xf0, 0xe9, 0x9e, 0xbc, 0x48, 0x65, 0x62, 0x6e, 0x8e, 0x95, 0x12, 0x8a, 0x4e, 0xa5, 0x55, - 0xf7, 0xe5, 0x39, 0xc1, 0xca, 0x7c, 0x32, 0x8b, 0x4b, 0x82, 0x78, 0x60, 0x92, 0x20, 0x9e, 0xd2, - 0x59, 0x46, 0x2e, 0x1d, 0x1c, 0x5e, 0x08, 0xcf, 0x2c, 0xc9, 0x08, 0xcf, 0xc8, 0x2c, 0x49, 0x05, - 0x19, 0x32, 0x54, 0xfc, 0x73, 0x9e, 0x91, 0x4b, 0x29, 0x28, 0x35, 0x37, 0xbf, 0x2c, 0x95, 0x26, - 0xb1, 0x52, 0xc8, 0x25, 0x50, 0x04, 0x36, 0x3d, 0xbe, 0xa4, 0x3c, 0xb1, 0x80, 0x08, 0x8f, 0x18, - 0x40, 0x3d, 0x22, 0x0d, 0xf1, 0x08, 0x4c, 0x33, 0x1e, 0xff, 0xf0, 0x41, 0xd4, 0x84, 0x94, 0x27, - 0x16, 0x80, 0xf8, 0x4e, 0x21, 0x27, 0x1e, 0xca, 0x31, 0xdc, 0x78, 0x28, 0xc7, 0xb0, 0xe2, 0x91, - 0x1c, 0xe3, 0x89, 0x47, 0x72, 0x8c, 0x17, 0x1e, 0xc9, 0x31, 0x3e, 0x78, 0x24, 0xc7, 0x38, 0xe1, - 0xb1, 0x1c, 0xc3, 0x85, 0xc7, 0x72, 0x0c, 0x37, 0x1e, 0xcb, 0x31, 0x44, 0xe9, 0xa5, 0x67, 0x96, - 0x64, 0x94, 0x26, 0xe9, 0x25, 0xe7, 0xe7, 0xea, 0x3b, 0xe7, 0x17, 0xe7, 0xe6, 0x17, 0x3b, 0xe7, - 0xe7, 0x81, 0xac, 0x29, 0x29, 0xd6, 0x07, 0x27, 0xe1, 0x0a, 0x58, 0x22, 0x2e, 0xa9, 0x2c, 0x48, - 0x2d, 0x4e, 0x62, 0x03, 0xa7, 0x60, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x62, 0x22, 0x7e, - 0x96, 0x25, 0x03, 0x00, 0x00, -} - -func (this *AddTrackingPriceHistoryProposal) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*AddTrackingPriceHistoryProposal) - if !ok { - that2, ok := that.(AddTrackingPriceHistoryProposal) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.Title != that1.Title { - return false - } - if this.Description != that1.Description { - return false - } - if len(this.TrackingList) != len(that1.TrackingList) { - return false - } - for i := range this.TrackingList { - if !this.TrackingList[i].Equal(&that1.TrackingList[i]) { - return false - } - } - return true -} -func (this *AddTrackingPriceHistoryWithWhitelistProposal) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*AddTrackingPriceHistoryWithWhitelistProposal) - if !ok { - that2, ok := that.(AddTrackingPriceHistoryWithWhitelistProposal) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.Title != that1.Title { - return false - } - if this.Description != that1.Description { - return false - } - if len(this.TrackingList) != len(that1.TrackingList) { - return false - } - for i := range this.TrackingList { - if !this.TrackingList[i].Equal(&that1.TrackingList[i]) { - return false - } - } - return true -} -func (this *RemoveTrackingPriceHistoryProposal) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*RemoveTrackingPriceHistoryProposal) - if !ok { - that2, ok := that.(RemoveTrackingPriceHistoryProposal) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.Title != that1.Title { - return false - } - if this.Description != that1.Description { - return false - } - if len(this.RemoveTwapList) != len(that1.RemoveTwapList) { - return false - } - for i := range this.RemoveTwapList { - if !this.RemoveTwapList[i].Equal(&that1.RemoveTwapList[i]) { - return false - } - } - return true -} -func (m *AddTrackingPriceHistoryProposal) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *AddTrackingPriceHistoryProposal) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *AddTrackingPriceHistoryProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.TrackingList) > 0 { - for iNdEx := len(m.TrackingList) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.TrackingList[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintProposal(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - if len(m.Description) > 0 { - i -= len(m.Description) - copy(dAtA[i:], m.Description) - i = encodeVarintProposal(dAtA, i, uint64(len(m.Description))) - i-- - dAtA[i] = 0x12 - } - if len(m.Title) > 0 { - i -= len(m.Title) - copy(dAtA[i:], m.Title) - i = encodeVarintProposal(dAtA, i, uint64(len(m.Title))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *AddTrackingPriceHistoryWithWhitelistProposal) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *AddTrackingPriceHistoryWithWhitelistProposal) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *AddTrackingPriceHistoryWithWhitelistProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.TrackingList) > 0 { - for iNdEx := len(m.TrackingList) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.TrackingList[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintProposal(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - if len(m.Description) > 0 { - i -= len(m.Description) - copy(dAtA[i:], m.Description) - i = encodeVarintProposal(dAtA, i, uint64(len(m.Description))) - i-- - dAtA[i] = 0x12 - } - if len(m.Title) > 0 { - i -= len(m.Title) - copy(dAtA[i:], m.Title) - i = encodeVarintProposal(dAtA, i, uint64(len(m.Title))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *RemoveTrackingPriceHistoryProposal) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RemoveTrackingPriceHistoryProposal) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RemoveTrackingPriceHistoryProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.RemoveTwapList) > 0 { - for iNdEx := len(m.RemoveTwapList) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.RemoveTwapList[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintProposal(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - if len(m.Description) > 0 { - i -= len(m.Description) - copy(dAtA[i:], m.Description) - i = encodeVarintProposal(dAtA, i, uint64(len(m.Description))) - i-- - dAtA[i] = 0x12 - } - if len(m.Title) > 0 { - i -= len(m.Title) - copy(dAtA[i:], m.Title) - i = encodeVarintProposal(dAtA, i, uint64(len(m.Title))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintProposal(dAtA []byte, offset int, v uint64) int { - offset -= sovProposal(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *AddTrackingPriceHistoryProposal) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Title) - if l > 0 { - n += 1 + l + sovProposal(uint64(l)) - } - l = len(m.Description) - if l > 0 { - n += 1 + l + sovProposal(uint64(l)) - } - if len(m.TrackingList) > 0 { - for _, e := range m.TrackingList { - l = e.Size() - n += 1 + l + sovProposal(uint64(l)) - } - } - return n -} - -func (m *AddTrackingPriceHistoryWithWhitelistProposal) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Title) - if l > 0 { - n += 1 + l + sovProposal(uint64(l)) - } - l = len(m.Description) - if l > 0 { - n += 1 + l + sovProposal(uint64(l)) - } - if len(m.TrackingList) > 0 { - for _, e := range m.TrackingList { - l = e.Size() - n += 1 + l + sovProposal(uint64(l)) - } - } - return n -} - -func (m *RemoveTrackingPriceHistoryProposal) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Title) - if l > 0 { - n += 1 + l + sovProposal(uint64(l)) - } - l = len(m.Description) - if l > 0 { - n += 1 + l + sovProposal(uint64(l)) - } - if len(m.RemoveTwapList) > 0 { - for _, e := range m.RemoveTwapList { - l = e.Size() - n += 1 + l + sovProposal(uint64(l)) - } - } - return n -} - -func sovProposal(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozProposal(x uint64) (n int) { - return sovProposal(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *AddTrackingPriceHistoryProposal) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProposal - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: AddTrackingPriceHistoryProposal: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: AddTrackingPriceHistoryProposal: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Title", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProposal - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthProposal - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthProposal - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Title = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProposal - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthProposal - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthProposal - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Description = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TrackingList", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProposal - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthProposal - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthProposal - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TrackingList = append(m.TrackingList, Denom{}) - if err := m.TrackingList[len(m.TrackingList)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipProposal(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthProposal - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *AddTrackingPriceHistoryWithWhitelistProposal) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProposal - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: AddTrackingPriceHistoryWithWhitelistProposal: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: AddTrackingPriceHistoryWithWhitelistProposal: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Title", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProposal - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthProposal - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthProposal - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Title = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProposal - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthProposal - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthProposal - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Description = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TrackingList", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProposal - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthProposal - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthProposal - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TrackingList = append(m.TrackingList, Denom{}) - if err := m.TrackingList[len(m.TrackingList)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipProposal(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthProposal - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RemoveTrackingPriceHistoryProposal) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProposal - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: RemoveTrackingPriceHistoryProposal: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RemoveTrackingPriceHistoryProposal: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Title", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProposal - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthProposal - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthProposal - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Title = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProposal - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthProposal - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthProposal - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Description = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RemoveTwapList", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProposal - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthProposal - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthProposal - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RemoveTwapList = append(m.RemoveTwapList, Denom{}) - if err := m.RemoveTwapList[len(m.RemoveTwapList)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipProposal(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthProposal - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipProposal(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowProposal - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowProposal - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowProposal - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthProposal - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupProposal - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthProposal - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthProposal = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowProposal = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupProposal = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/oracle/types/query.pb.go b/x/oracle/types/query.pb.go deleted file mode 100644 index 4c13fb3b8..000000000 --- a/x/oracle/types/query.pb.go +++ /dev/null @@ -1,5546 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: juno/oracle/v1/query.proto - -package types - -import ( - context "context" - fmt "fmt" - github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - types "github.com/cosmos/cosmos-sdk/types" - query "github.com/cosmos/cosmos-sdk/types/query" - _ "github.com/cosmos/gogoproto/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" - github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" - _ "google.golang.org/genproto/googleapis/api/annotations" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - _ "google.golang.org/protobuf/types/known/timestamppb" - io "io" - math "math" - math_bits "math/bits" - time "time" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf -var _ = time.Kitchen - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// QueryExchangeRates is the request type for the Query/ExchangeRate RPC -// method. -type QueryExchangeRates struct { - // denom defines the denomination to query for. - Denom string `protobuf:"bytes,1,opt,name=denom,proto3" json:"denom,omitempty"` -} - -func (m *QueryExchangeRates) Reset() { *m = QueryExchangeRates{} } -func (m *QueryExchangeRates) String() string { return proto.CompactTextString(m) } -func (*QueryExchangeRates) ProtoMessage() {} -func (*QueryExchangeRates) Descriptor() ([]byte, []int) { - return fileDescriptor_b4047ca459cdb37a, []int{0} -} -func (m *QueryExchangeRates) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryExchangeRates) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryExchangeRates.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryExchangeRates) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryExchangeRates.Merge(m, src) -} -func (m *QueryExchangeRates) XXX_Size() int { - return m.Size() -} -func (m *QueryExchangeRates) XXX_DiscardUnknown() { - xxx_messageInfo_QueryExchangeRates.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryExchangeRates proto.InternalMessageInfo - -// QueryExchangeRatesResponse is response type for the -// Query/ExchangeRates RPC method. -type QueryExchangeRatesResponse struct { - // exchange_rates defines a list of the exchange rate for all whitelisted - // denoms. - ExchangeRates github_com_cosmos_cosmos_sdk_types.DecCoins `protobuf:"bytes,1,rep,name=exchange_rates,json=exchangeRates,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.DecCoins" json:"exchange_rates"` -} - -func (m *QueryExchangeRatesResponse) Reset() { *m = QueryExchangeRatesResponse{} } -func (m *QueryExchangeRatesResponse) String() string { return proto.CompactTextString(m) } -func (*QueryExchangeRatesResponse) ProtoMessage() {} -func (*QueryExchangeRatesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b4047ca459cdb37a, []int{1} -} -func (m *QueryExchangeRatesResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryExchangeRatesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryExchangeRatesResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryExchangeRatesResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryExchangeRatesResponse.Merge(m, src) -} -func (m *QueryExchangeRatesResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryExchangeRatesResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryExchangeRatesResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryExchangeRatesResponse proto.InternalMessageInfo - -// QueryActiveExchangeRates is the request type for the -// Query/ActiveExchangeRates RPC method. -type QueryActiveExchangeRates struct { -} - -func (m *QueryActiveExchangeRates) Reset() { *m = QueryActiveExchangeRates{} } -func (m *QueryActiveExchangeRates) String() string { return proto.CompactTextString(m) } -func (*QueryActiveExchangeRates) ProtoMessage() {} -func (*QueryActiveExchangeRates) Descriptor() ([]byte, []int) { - return fileDescriptor_b4047ca459cdb37a, []int{2} -} -func (m *QueryActiveExchangeRates) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryActiveExchangeRates) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryActiveExchangeRates.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryActiveExchangeRates) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryActiveExchangeRates.Merge(m, src) -} -func (m *QueryActiveExchangeRates) XXX_Size() int { - return m.Size() -} -func (m *QueryActiveExchangeRates) XXX_DiscardUnknown() { - xxx_messageInfo_QueryActiveExchangeRates.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryActiveExchangeRates proto.InternalMessageInfo - -// QueryActiveExchangeRatesResponse is response type for the -// Query/ActiveExchangeRates RPC method. -type QueryActiveExchangeRatesResponse struct { - // activeRates defines a list of the denomination which oracle prices aggreed - // upon. - ActiveRates []string `protobuf:"bytes,1,rep,name=active_rates,json=activeRates,proto3" json:"active_rates,omitempty"` -} - -func (m *QueryActiveExchangeRatesResponse) Reset() { *m = QueryActiveExchangeRatesResponse{} } -func (m *QueryActiveExchangeRatesResponse) String() string { return proto.CompactTextString(m) } -func (*QueryActiveExchangeRatesResponse) ProtoMessage() {} -func (*QueryActiveExchangeRatesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b4047ca459cdb37a, []int{3} -} -func (m *QueryActiveExchangeRatesResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryActiveExchangeRatesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryActiveExchangeRatesResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryActiveExchangeRatesResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryActiveExchangeRatesResponse.Merge(m, src) -} -func (m *QueryActiveExchangeRatesResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryActiveExchangeRatesResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryActiveExchangeRatesResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryActiveExchangeRatesResponse proto.InternalMessageInfo - -// QueryFeederDelegation is the request type for the -// Query/FeederDelegation RPC method. -type QueryFeederDelegation struct { - // validator defines the validator address to query for. - ValidatorAddr string `protobuf:"bytes,1,opt,name=validator_addr,json=validatorAddr,proto3" json:"validator_addr,omitempty"` -} - -func (m *QueryFeederDelegation) Reset() { *m = QueryFeederDelegation{} } -func (m *QueryFeederDelegation) String() string { return proto.CompactTextString(m) } -func (*QueryFeederDelegation) ProtoMessage() {} -func (*QueryFeederDelegation) Descriptor() ([]byte, []int) { - return fileDescriptor_b4047ca459cdb37a, []int{4} -} -func (m *QueryFeederDelegation) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryFeederDelegation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryFeederDelegation.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryFeederDelegation) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryFeederDelegation.Merge(m, src) -} -func (m *QueryFeederDelegation) XXX_Size() int { - return m.Size() -} -func (m *QueryFeederDelegation) XXX_DiscardUnknown() { - xxx_messageInfo_QueryFeederDelegation.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryFeederDelegation proto.InternalMessageInfo - -// QueryFeederDelegationResponse is response type for the -// Query/FeederDelegation RPC method. -type QueryFeederDelegationResponse struct { - // feeder_addr defines the feeder delegation of a validator - FeederAddr string `protobuf:"bytes,1,opt,name=feeder_addr,json=feederAddr,proto3" json:"feeder_addr,omitempty"` -} - -func (m *QueryFeederDelegationResponse) Reset() { *m = QueryFeederDelegationResponse{} } -func (m *QueryFeederDelegationResponse) String() string { return proto.CompactTextString(m) } -func (*QueryFeederDelegationResponse) ProtoMessage() {} -func (*QueryFeederDelegationResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b4047ca459cdb37a, []int{5} -} -func (m *QueryFeederDelegationResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryFeederDelegationResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryFeederDelegationResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryFeederDelegationResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryFeederDelegationResponse.Merge(m, src) -} -func (m *QueryFeederDelegationResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryFeederDelegationResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryFeederDelegationResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryFeederDelegationResponse proto.InternalMessageInfo - -// QueryMissCounter is the request type for the Query/MissCounter RPC -// method. -type QueryMissCounter struct { - // validator defines the validator address to query for. - ValidatorAddr string `protobuf:"bytes,1,opt,name=validator_addr,json=validatorAddr,proto3" json:"validator_addr,omitempty"` -} - -func (m *QueryMissCounter) Reset() { *m = QueryMissCounter{} } -func (m *QueryMissCounter) String() string { return proto.CompactTextString(m) } -func (*QueryMissCounter) ProtoMessage() {} -func (*QueryMissCounter) Descriptor() ([]byte, []int) { - return fileDescriptor_b4047ca459cdb37a, []int{6} -} -func (m *QueryMissCounter) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryMissCounter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryMissCounter.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryMissCounter) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryMissCounter.Merge(m, src) -} -func (m *QueryMissCounter) XXX_Size() int { - return m.Size() -} -func (m *QueryMissCounter) XXX_DiscardUnknown() { - xxx_messageInfo_QueryMissCounter.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryMissCounter proto.InternalMessageInfo - -// QueryMissCounterResponse is response type for the -// Query/MissCounter RPC method. -type QueryMissCounterResponse struct { - // miss_counter defines the oracle miss counter of a validator - MissCounter uint64 `protobuf:"varint,1,opt,name=miss_counter,json=missCounter,proto3" json:"miss_counter,omitempty"` -} - -func (m *QueryMissCounterResponse) Reset() { *m = QueryMissCounterResponse{} } -func (m *QueryMissCounterResponse) String() string { return proto.CompactTextString(m) } -func (*QueryMissCounterResponse) ProtoMessage() {} -func (*QueryMissCounterResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b4047ca459cdb37a, []int{7} -} -func (m *QueryMissCounterResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryMissCounterResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryMissCounterResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryMissCounterResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryMissCounterResponse.Merge(m, src) -} -func (m *QueryMissCounterResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryMissCounterResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryMissCounterResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryMissCounterResponse proto.InternalMessageInfo - -// QuerySlashWindow is the request type for the -// Query/SlashWindow RPC method. -type QuerySlashWindow struct { -} - -func (m *QuerySlashWindow) Reset() { *m = QuerySlashWindow{} } -func (m *QuerySlashWindow) String() string { return proto.CompactTextString(m) } -func (*QuerySlashWindow) ProtoMessage() {} -func (*QuerySlashWindow) Descriptor() ([]byte, []int) { - return fileDescriptor_b4047ca459cdb37a, []int{8} -} -func (m *QuerySlashWindow) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QuerySlashWindow) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QuerySlashWindow.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QuerySlashWindow) XXX_Merge(src proto.Message) { - xxx_messageInfo_QuerySlashWindow.Merge(m, src) -} -func (m *QuerySlashWindow) XXX_Size() int { - return m.Size() -} -func (m *QuerySlashWindow) XXX_DiscardUnknown() { - xxx_messageInfo_QuerySlashWindow.DiscardUnknown(m) -} - -var xxx_messageInfo_QuerySlashWindow proto.InternalMessageInfo - -// QuerySlashWindowResponse is response type for the -// Query/SlashWindow RPC method. -type QuerySlashWindowResponse struct { - // window_progress defines the number of voting periods - // since the last slashing event would have taken place. - WindowProgress uint64 `protobuf:"varint,1,opt,name=window_progress,json=windowProgress,proto3" json:"window_progress,omitempty"` -} - -func (m *QuerySlashWindowResponse) Reset() { *m = QuerySlashWindowResponse{} } -func (m *QuerySlashWindowResponse) String() string { return proto.CompactTextString(m) } -func (*QuerySlashWindowResponse) ProtoMessage() {} -func (*QuerySlashWindowResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b4047ca459cdb37a, []int{9} -} -func (m *QuerySlashWindowResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QuerySlashWindowResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QuerySlashWindowResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QuerySlashWindowResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QuerySlashWindowResponse.Merge(m, src) -} -func (m *QuerySlashWindowResponse) XXX_Size() int { - return m.Size() -} -func (m *QuerySlashWindowResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QuerySlashWindowResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QuerySlashWindowResponse proto.InternalMessageInfo - -// QueryAggregatePrevote is the request type for the -// Query/AggregatePrevote RPC method. -type QueryAggregatePrevote struct { - // validator defines the validator address to query for. - ValidatorAddr string `protobuf:"bytes,1,opt,name=validator_addr,json=validatorAddr,proto3" json:"validator_addr,omitempty"` -} - -func (m *QueryAggregatePrevote) Reset() { *m = QueryAggregatePrevote{} } -func (m *QueryAggregatePrevote) String() string { return proto.CompactTextString(m) } -func (*QueryAggregatePrevote) ProtoMessage() {} -func (*QueryAggregatePrevote) Descriptor() ([]byte, []int) { - return fileDescriptor_b4047ca459cdb37a, []int{10} -} -func (m *QueryAggregatePrevote) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryAggregatePrevote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryAggregatePrevote.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryAggregatePrevote) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryAggregatePrevote.Merge(m, src) -} -func (m *QueryAggregatePrevote) XXX_Size() int { - return m.Size() -} -func (m *QueryAggregatePrevote) XXX_DiscardUnknown() { - xxx_messageInfo_QueryAggregatePrevote.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryAggregatePrevote proto.InternalMessageInfo - -// QueryAggregatePrevoteResponse is response type for the -// Query/AggregatePrevote RPC method. -type QueryAggregatePrevoteResponse struct { - // aggregate_prevote defines oracle aggregate prevote submitted by a validator - // in the current vote period - AggregatePrevote AggregateExchangeRatePrevote `protobuf:"bytes,1,opt,name=aggregate_prevote,json=aggregatePrevote,proto3" json:"aggregate_prevote"` -} - -func (m *QueryAggregatePrevoteResponse) Reset() { *m = QueryAggregatePrevoteResponse{} } -func (m *QueryAggregatePrevoteResponse) String() string { return proto.CompactTextString(m) } -func (*QueryAggregatePrevoteResponse) ProtoMessage() {} -func (*QueryAggregatePrevoteResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b4047ca459cdb37a, []int{11} -} -func (m *QueryAggregatePrevoteResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryAggregatePrevoteResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryAggregatePrevoteResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryAggregatePrevoteResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryAggregatePrevoteResponse.Merge(m, src) -} -func (m *QueryAggregatePrevoteResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryAggregatePrevoteResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryAggregatePrevoteResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryAggregatePrevoteResponse proto.InternalMessageInfo - -// QueryAggregatePrevotes is the request type for the -// Query/AggregatePrevotes RPC method. -type QueryAggregatePrevotes struct { -} - -func (m *QueryAggregatePrevotes) Reset() { *m = QueryAggregatePrevotes{} } -func (m *QueryAggregatePrevotes) String() string { return proto.CompactTextString(m) } -func (*QueryAggregatePrevotes) ProtoMessage() {} -func (*QueryAggregatePrevotes) Descriptor() ([]byte, []int) { - return fileDescriptor_b4047ca459cdb37a, []int{12} -} -func (m *QueryAggregatePrevotes) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryAggregatePrevotes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryAggregatePrevotes.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryAggregatePrevotes) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryAggregatePrevotes.Merge(m, src) -} -func (m *QueryAggregatePrevotes) XXX_Size() int { - return m.Size() -} -func (m *QueryAggregatePrevotes) XXX_DiscardUnknown() { - xxx_messageInfo_QueryAggregatePrevotes.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryAggregatePrevotes proto.InternalMessageInfo - -// QueryAggregatePrevotesResponse is response type for the -// Query/AggregatePrevotes RPC method. -type QueryAggregatePrevotesResponse struct { - // aggregate_prevotes defines all oracle aggregate prevotes submitted in the - // current vote period - AggregatePrevotes []AggregateExchangeRatePrevote `protobuf:"bytes,1,rep,name=aggregate_prevotes,json=aggregatePrevotes,proto3" json:"aggregate_prevotes"` -} - -func (m *QueryAggregatePrevotesResponse) Reset() { *m = QueryAggregatePrevotesResponse{} } -func (m *QueryAggregatePrevotesResponse) String() string { return proto.CompactTextString(m) } -func (*QueryAggregatePrevotesResponse) ProtoMessage() {} -func (*QueryAggregatePrevotesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b4047ca459cdb37a, []int{13} -} -func (m *QueryAggregatePrevotesResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryAggregatePrevotesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryAggregatePrevotesResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryAggregatePrevotesResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryAggregatePrevotesResponse.Merge(m, src) -} -func (m *QueryAggregatePrevotesResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryAggregatePrevotesResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryAggregatePrevotesResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryAggregatePrevotesResponse proto.InternalMessageInfo - -// QueryAggregateVote is the request type for the Query/AggregateVote RPC -// method. -type QueryAggregateVote struct { - // validator defines the validator address to query for. - ValidatorAddr string `protobuf:"bytes,1,opt,name=validator_addr,json=validatorAddr,proto3" json:"validator_addr,omitempty"` -} - -func (m *QueryAggregateVote) Reset() { *m = QueryAggregateVote{} } -func (m *QueryAggregateVote) String() string { return proto.CompactTextString(m) } -func (*QueryAggregateVote) ProtoMessage() {} -func (*QueryAggregateVote) Descriptor() ([]byte, []int) { - return fileDescriptor_b4047ca459cdb37a, []int{14} -} -func (m *QueryAggregateVote) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryAggregateVote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryAggregateVote.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryAggregateVote) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryAggregateVote.Merge(m, src) -} -func (m *QueryAggregateVote) XXX_Size() int { - return m.Size() -} -func (m *QueryAggregateVote) XXX_DiscardUnknown() { - xxx_messageInfo_QueryAggregateVote.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryAggregateVote proto.InternalMessageInfo - -// QueryAggregateVoteResponse is response type for the -// Query/AggregateVote RPC method. -type QueryAggregateVoteResponse struct { - // aggregate_vote defines oracle aggregate vote submitted by a validator in - // the current vote period - AggregateVote AggregateExchangeRateVote `protobuf:"bytes,1,opt,name=aggregate_vote,json=aggregateVote,proto3" json:"aggregate_vote"` -} - -func (m *QueryAggregateVoteResponse) Reset() { *m = QueryAggregateVoteResponse{} } -func (m *QueryAggregateVoteResponse) String() string { return proto.CompactTextString(m) } -func (*QueryAggregateVoteResponse) ProtoMessage() {} -func (*QueryAggregateVoteResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b4047ca459cdb37a, []int{15} -} -func (m *QueryAggregateVoteResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryAggregateVoteResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryAggregateVoteResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryAggregateVoteResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryAggregateVoteResponse.Merge(m, src) -} -func (m *QueryAggregateVoteResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryAggregateVoteResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryAggregateVoteResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryAggregateVoteResponse proto.InternalMessageInfo - -// QueryAggregateVotes is the request type for the Query/AggregateVotes -// RPC method. -type QueryAggregateVotes struct { -} - -func (m *QueryAggregateVotes) Reset() { *m = QueryAggregateVotes{} } -func (m *QueryAggregateVotes) String() string { return proto.CompactTextString(m) } -func (*QueryAggregateVotes) ProtoMessage() {} -func (*QueryAggregateVotes) Descriptor() ([]byte, []int) { - return fileDescriptor_b4047ca459cdb37a, []int{16} -} -func (m *QueryAggregateVotes) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryAggregateVotes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryAggregateVotes.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryAggregateVotes) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryAggregateVotes.Merge(m, src) -} -func (m *QueryAggregateVotes) XXX_Size() int { - return m.Size() -} -func (m *QueryAggregateVotes) XXX_DiscardUnknown() { - xxx_messageInfo_QueryAggregateVotes.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryAggregateVotes proto.InternalMessageInfo - -// QueryAggregateVotesResponse is response type for the -// Query/AggregateVotes RPC method. -type QueryAggregateVotesResponse struct { - // aggregate_votes defines all oracle aggregate votes submitted in the current - // vote period - AggregateVotes []AggregateExchangeRateVote `protobuf:"bytes,1,rep,name=aggregate_votes,json=aggregateVotes,proto3" json:"aggregate_votes"` -} - -func (m *QueryAggregateVotesResponse) Reset() { *m = QueryAggregateVotesResponse{} } -func (m *QueryAggregateVotesResponse) String() string { return proto.CompactTextString(m) } -func (*QueryAggregateVotesResponse) ProtoMessage() {} -func (*QueryAggregateVotesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b4047ca459cdb37a, []int{17} -} -func (m *QueryAggregateVotesResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryAggregateVotesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryAggregateVotesResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryAggregateVotesResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryAggregateVotesResponse.Merge(m, src) -} -func (m *QueryAggregateVotesResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryAggregateVotesResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryAggregateVotesResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryAggregateVotesResponse proto.InternalMessageInfo - -// QueryParams is the request type for the Query/Params RPC method. -type QueryParams struct { -} - -func (m *QueryParams) Reset() { *m = QueryParams{} } -func (m *QueryParams) String() string { return proto.CompactTextString(m) } -func (*QueryParams) ProtoMessage() {} -func (*QueryParams) Descriptor() ([]byte, []int) { - return fileDescriptor_b4047ca459cdb37a, []int{18} -} -func (m *QueryParams) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryParams.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryParams) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryParams.Merge(m, src) -} -func (m *QueryParams) XXX_Size() int { - return m.Size() -} -func (m *QueryParams) XXX_DiscardUnknown() { - xxx_messageInfo_QueryParams.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryParams proto.InternalMessageInfo - -// QueryParamsResponse is the response type for the Query/Params RPC method. -type QueryParamsResponse struct { - // params defines the parameters of the module. - Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` -} - -func (m *QueryParamsResponse) Reset() { *m = QueryParamsResponse{} } -func (m *QueryParamsResponse) String() string { return proto.CompactTextString(m) } -func (*QueryParamsResponse) ProtoMessage() {} -func (*QueryParamsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b4047ca459cdb37a, []int{19} -} -func (m *QueryParamsResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryParamsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryParamsResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryParamsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryParamsResponse.Merge(m, src) -} -func (m *QueryParamsResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryParamsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryParamsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryParamsResponse proto.InternalMessageInfo - -type QueryTwapTrackingLists struct { -} - -func (m *QueryTwapTrackingLists) Reset() { *m = QueryTwapTrackingLists{} } -func (m *QueryTwapTrackingLists) String() string { return proto.CompactTextString(m) } -func (*QueryTwapTrackingLists) ProtoMessage() {} -func (*QueryTwapTrackingLists) Descriptor() ([]byte, []int) { - return fileDescriptor_b4047ca459cdb37a, []int{20} -} -func (m *QueryTwapTrackingLists) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryTwapTrackingLists) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryTwapTrackingLists.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryTwapTrackingLists) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryTwapTrackingLists.Merge(m, src) -} -func (m *QueryTwapTrackingLists) XXX_Size() int { - return m.Size() -} -func (m *QueryTwapTrackingLists) XXX_DiscardUnknown() { - xxx_messageInfo_QueryTwapTrackingLists.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryTwapTrackingLists proto.InternalMessageInfo - -type QueryTwapTrackingListsResponse struct { - TwapTrackingLists []string `protobuf:"bytes,1,rep,name=twap_tracking_lists,json=twapTrackingLists,proto3" json:"twap_tracking_lists,omitempty"` -} - -func (m *QueryTwapTrackingListsResponse) Reset() { *m = QueryTwapTrackingListsResponse{} } -func (m *QueryTwapTrackingListsResponse) String() string { return proto.CompactTextString(m) } -func (*QueryTwapTrackingListsResponse) ProtoMessage() {} -func (*QueryTwapTrackingListsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b4047ca459cdb37a, []int{21} -} -func (m *QueryTwapTrackingListsResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryTwapTrackingListsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryTwapTrackingListsResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryTwapTrackingListsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryTwapTrackingListsResponse.Merge(m, src) -} -func (m *QueryTwapTrackingListsResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryTwapTrackingListsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryTwapTrackingListsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryTwapTrackingListsResponse proto.InternalMessageInfo - -type QueryPriceHistoryAtTime struct { - Denom string `protobuf:"bytes,1,opt,name=denom,proto3" json:"denom,omitempty"` - Time time.Time `protobuf:"bytes,2,opt,name=time,proto3,stdtime" json:"time" yaml:"time"` -} - -func (m *QueryPriceHistoryAtTime) Reset() { *m = QueryPriceHistoryAtTime{} } -func (m *QueryPriceHistoryAtTime) String() string { return proto.CompactTextString(m) } -func (*QueryPriceHistoryAtTime) ProtoMessage() {} -func (*QueryPriceHistoryAtTime) Descriptor() ([]byte, []int) { - return fileDescriptor_b4047ca459cdb37a, []int{22} -} -func (m *QueryPriceHistoryAtTime) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryPriceHistoryAtTime) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryPriceHistoryAtTime.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryPriceHistoryAtTime) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryPriceHistoryAtTime.Merge(m, src) -} -func (m *QueryPriceHistoryAtTime) XXX_Size() int { - return m.Size() -} -func (m *QueryPriceHistoryAtTime) XXX_DiscardUnknown() { - xxx_messageInfo_QueryPriceHistoryAtTime.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryPriceHistoryAtTime proto.InternalMessageInfo - -type QueryPriceHistoryAtTimeResponse struct { - Denom Denom `protobuf:"bytes,1,opt,name=denom,proto3" json:"denom"` - PriceHistoryEntry PriceHistoryEntry `protobuf:"bytes,2,opt,name=price_history_entry,json=priceHistoryEntry,proto3" json:"price_history_entry"` -} - -func (m *QueryPriceHistoryAtTimeResponse) Reset() { *m = QueryPriceHistoryAtTimeResponse{} } -func (m *QueryPriceHistoryAtTimeResponse) String() string { return proto.CompactTextString(m) } -func (*QueryPriceHistoryAtTimeResponse) ProtoMessage() {} -func (*QueryPriceHistoryAtTimeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b4047ca459cdb37a, []int{23} -} -func (m *QueryPriceHistoryAtTimeResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryPriceHistoryAtTimeResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryPriceHistoryAtTimeResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryPriceHistoryAtTimeResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryPriceHistoryAtTimeResponse.Merge(m, src) -} -func (m *QueryPriceHistoryAtTimeResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryPriceHistoryAtTimeResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryPriceHistoryAtTimeResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryPriceHistoryAtTimeResponse proto.InternalMessageInfo - -type QueryAllPriceHistory struct { - Denom string `protobuf:"bytes,1,opt,name=denom,proto3" json:"denom,omitempty"` - Pagination *query.PageRequest `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` -} - -func (m *QueryAllPriceHistory) Reset() { *m = QueryAllPriceHistory{} } -func (m *QueryAllPriceHistory) String() string { return proto.CompactTextString(m) } -func (*QueryAllPriceHistory) ProtoMessage() {} -func (*QueryAllPriceHistory) Descriptor() ([]byte, []int) { - return fileDescriptor_b4047ca459cdb37a, []int{24} -} -func (m *QueryAllPriceHistory) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryAllPriceHistory) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryAllPriceHistory.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryAllPriceHistory) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryAllPriceHistory.Merge(m, src) -} -func (m *QueryAllPriceHistory) XXX_Size() int { - return m.Size() -} -func (m *QueryAllPriceHistory) XXX_DiscardUnknown() { - xxx_messageInfo_QueryAllPriceHistory.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryAllPriceHistory proto.InternalMessageInfo - -type QueryAllPriceHistoryResponse struct { - Denom Denom `protobuf:"bytes,1,opt,name=denom,proto3" json:"denom"` - PriceHistoryEntrys []PriceHistoryEntry `protobuf:"bytes,2,rep,name=price_history_entrys,json=priceHistoryEntrys,proto3" json:"price_history_entrys"` - Pagination *query.PageResponse `protobuf:"bytes,3,opt,name=pagination,proto3" json:"pagination,omitempty"` -} - -func (m *QueryAllPriceHistoryResponse) Reset() { *m = QueryAllPriceHistoryResponse{} } -func (m *QueryAllPriceHistoryResponse) String() string { return proto.CompactTextString(m) } -func (*QueryAllPriceHistoryResponse) ProtoMessage() {} -func (*QueryAllPriceHistoryResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b4047ca459cdb37a, []int{25} -} -func (m *QueryAllPriceHistoryResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryAllPriceHistoryResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryAllPriceHistoryResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryAllPriceHistoryResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryAllPriceHistoryResponse.Merge(m, src) -} -func (m *QueryAllPriceHistoryResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryAllPriceHistoryResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryAllPriceHistoryResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryAllPriceHistoryResponse proto.InternalMessageInfo - -type QueryArithmeticTwapPriceBetweenTime struct { - Denom string `protobuf:"bytes,1,opt,name=denom,proto3" json:"denom,omitempty"` - StartTime time.Time `protobuf:"bytes,2,opt,name=start_time,json=startTime,proto3,stdtime" json:"start_time" yaml:"start_time"` - EndTime time.Time `protobuf:"bytes,3,opt,name=end_time,json=endTime,proto3,stdtime" json:"end_time" yaml:"end_time"` -} - -func (m *QueryArithmeticTwapPriceBetweenTime) Reset() { *m = QueryArithmeticTwapPriceBetweenTime{} } -func (m *QueryArithmeticTwapPriceBetweenTime) String() string { return proto.CompactTextString(m) } -func (*QueryArithmeticTwapPriceBetweenTime) ProtoMessage() {} -func (*QueryArithmeticTwapPriceBetweenTime) Descriptor() ([]byte, []int) { - return fileDescriptor_b4047ca459cdb37a, []int{26} -} -func (m *QueryArithmeticTwapPriceBetweenTime) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryArithmeticTwapPriceBetweenTime) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryArithmeticTwapPriceBetweenTime.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryArithmeticTwapPriceBetweenTime) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryArithmeticTwapPriceBetweenTime.Merge(m, src) -} -func (m *QueryArithmeticTwapPriceBetweenTime) XXX_Size() int { - return m.Size() -} -func (m *QueryArithmeticTwapPriceBetweenTime) XXX_DiscardUnknown() { - xxx_messageInfo_QueryArithmeticTwapPriceBetweenTime.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryArithmeticTwapPriceBetweenTime proto.InternalMessageInfo - -type QueryArithmeticTwapPriceBetweenTimeResponse struct { - TwapPrice types.DecCoin `protobuf:"bytes,1,opt,name=twap_price,json=twapPrice,proto3" json:"twap_price" yaml:"twap_price"` -} - -func (m *QueryArithmeticTwapPriceBetweenTimeResponse) Reset() { - *m = QueryArithmeticTwapPriceBetweenTimeResponse{} -} -func (m *QueryArithmeticTwapPriceBetweenTimeResponse) String() string { - return proto.CompactTextString(m) -} -func (*QueryArithmeticTwapPriceBetweenTimeResponse) ProtoMessage() {} -func (*QueryArithmeticTwapPriceBetweenTimeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b4047ca459cdb37a, []int{27} -} -func (m *QueryArithmeticTwapPriceBetweenTimeResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryArithmeticTwapPriceBetweenTimeResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryArithmeticTwapPriceBetweenTimeResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryArithmeticTwapPriceBetweenTimeResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryArithmeticTwapPriceBetweenTimeResponse.Merge(m, src) -} -func (m *QueryArithmeticTwapPriceBetweenTimeResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryArithmeticTwapPriceBetweenTimeResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryArithmeticTwapPriceBetweenTimeResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryArithmeticTwapPriceBetweenTimeResponse proto.InternalMessageInfo - -func init() { - proto.RegisterType((*QueryExchangeRates)(nil), "juno.oracle.v1.QueryExchangeRates") - proto.RegisterType((*QueryExchangeRatesResponse)(nil), "juno.oracle.v1.QueryExchangeRatesResponse") - proto.RegisterType((*QueryActiveExchangeRates)(nil), "juno.oracle.v1.QueryActiveExchangeRates") - proto.RegisterType((*QueryActiveExchangeRatesResponse)(nil), "juno.oracle.v1.QueryActiveExchangeRatesResponse") - proto.RegisterType((*QueryFeederDelegation)(nil), "juno.oracle.v1.QueryFeederDelegation") - proto.RegisterType((*QueryFeederDelegationResponse)(nil), "juno.oracle.v1.QueryFeederDelegationResponse") - proto.RegisterType((*QueryMissCounter)(nil), "juno.oracle.v1.QueryMissCounter") - proto.RegisterType((*QueryMissCounterResponse)(nil), "juno.oracle.v1.QueryMissCounterResponse") - proto.RegisterType((*QuerySlashWindow)(nil), "juno.oracle.v1.QuerySlashWindow") - proto.RegisterType((*QuerySlashWindowResponse)(nil), "juno.oracle.v1.QuerySlashWindowResponse") - proto.RegisterType((*QueryAggregatePrevote)(nil), "juno.oracle.v1.QueryAggregatePrevote") - proto.RegisterType((*QueryAggregatePrevoteResponse)(nil), "juno.oracle.v1.QueryAggregatePrevoteResponse") - proto.RegisterType((*QueryAggregatePrevotes)(nil), "juno.oracle.v1.QueryAggregatePrevotes") - proto.RegisterType((*QueryAggregatePrevotesResponse)(nil), "juno.oracle.v1.QueryAggregatePrevotesResponse") - proto.RegisterType((*QueryAggregateVote)(nil), "juno.oracle.v1.QueryAggregateVote") - proto.RegisterType((*QueryAggregateVoteResponse)(nil), "juno.oracle.v1.QueryAggregateVoteResponse") - proto.RegisterType((*QueryAggregateVotes)(nil), "juno.oracle.v1.QueryAggregateVotes") - proto.RegisterType((*QueryAggregateVotesResponse)(nil), "juno.oracle.v1.QueryAggregateVotesResponse") - proto.RegisterType((*QueryParams)(nil), "juno.oracle.v1.QueryParams") - proto.RegisterType((*QueryParamsResponse)(nil), "juno.oracle.v1.QueryParamsResponse") - proto.RegisterType((*QueryTwapTrackingLists)(nil), "juno.oracle.v1.QueryTwapTrackingLists") - proto.RegisterType((*QueryTwapTrackingListsResponse)(nil), "juno.oracle.v1.QueryTwapTrackingListsResponse") - proto.RegisterType((*QueryPriceHistoryAtTime)(nil), "juno.oracle.v1.QueryPriceHistoryAtTime") - proto.RegisterType((*QueryPriceHistoryAtTimeResponse)(nil), "juno.oracle.v1.QueryPriceHistoryAtTimeResponse") - proto.RegisterType((*QueryAllPriceHistory)(nil), "juno.oracle.v1.QueryAllPriceHistory") - proto.RegisterType((*QueryAllPriceHistoryResponse)(nil), "juno.oracle.v1.QueryAllPriceHistoryResponse") - proto.RegisterType((*QueryArithmeticTwapPriceBetweenTime)(nil), "juno.oracle.v1.QueryArithmeticTwapPriceBetweenTime") - proto.RegisterType((*QueryArithmeticTwapPriceBetweenTimeResponse)(nil), "juno.oracle.v1.QueryArithmeticTwapPriceBetweenTimeResponse") -} - -func init() { proto.RegisterFile("juno/oracle/v1/query.proto", fileDescriptor_b4047ca459cdb37a) } - -var fileDescriptor_b4047ca459cdb37a = []byte{ - // 1499 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x98, 0xdb, 0x6f, 0x13, 0xc7, - 0x17, 0xc7, 0xbd, 0xdc, 0x7e, 0xe4, 0xf8, 0x17, 0x27, 0x9e, 0x04, 0x70, 0x37, 0xc1, 0x0e, 0xc3, - 0x25, 0x29, 0x24, 0xbb, 0xc4, 0xa4, 0x52, 0x95, 0x42, 0xdb, 0xdc, 0x00, 0xa9, 0x54, 0x4a, 0xdd, - 0x08, 0x68, 0x5f, 0xac, 0x89, 0x3d, 0x38, 0x0b, 0xf6, 0xae, 0xd9, 0x99, 0xdc, 0x84, 0x50, 0xab, - 0x56, 0x95, 0xfa, 0x88, 0x44, 0xc5, 0x33, 0xbd, 0x48, 0xad, 0x2a, 0x55, 0xfd, 0x37, 0x90, 0xfa, - 0x82, 0xd4, 0x17, 0x9e, 0xa0, 0x85, 0x3e, 0xb4, 0xaf, 0x95, 0xfa, 0x5e, 0xed, 0xcc, 0x78, 0xb3, - 0x37, 0x5f, 0x92, 0x3e, 0x81, 0xe7, 0x9c, 0xf9, 0x9e, 0xcf, 0x39, 0x3b, 0xb7, 0x13, 0xd0, 0x6f, - 0xaf, 0xdb, 0x8e, 0xe9, 0xb8, 0xa4, 0x52, 0xa7, 0xe6, 0xc6, 0xb4, 0x79, 0x77, 0x9d, 0xba, 0xdb, - 0x46, 0xd3, 0x75, 0xb8, 0x83, 0x32, 0x9e, 0xcd, 0x90, 0x36, 0x63, 0x63, 0x5a, 0x1f, 0xae, 0x39, - 0x35, 0x47, 0x98, 0x4c, 0xef, 0x7f, 0xd2, 0x4b, 0x1f, 0xad, 0x39, 0x4e, 0xad, 0x4e, 0x4d, 0xd2, - 0xb4, 0x4c, 0x62, 0xdb, 0x0e, 0x27, 0xdc, 0x72, 0x6c, 0xa6, 0xac, 0x23, 0x11, 0x7d, 0xa5, 0x26, - 0x8d, 0xf9, 0x8a, 0xc3, 0x1a, 0x0e, 0x33, 0x57, 0x09, 0xf3, 0x8c, 0xab, 0x94, 0x93, 0x69, 0xb3, - 0xe2, 0x58, 0xb6, 0xb2, 0x17, 0x94, 0xb4, 0xf8, 0xb5, 0xba, 0x7e, 0xcb, 0xe4, 0x56, 0x83, 0x32, - 0x4e, 0x1a, 0x4d, 0xe5, 0x70, 0x36, 0x28, 0x20, 0xd0, 0x7d, 0x99, 0x26, 0xa9, 0x59, 0xb6, 0x40, - 0x91, 0xbe, 0x78, 0x06, 0xd0, 0x07, 0x9e, 0xc7, 0xd2, 0x56, 0x65, 0x8d, 0xd8, 0x35, 0x5a, 0x22, - 0x9c, 0x32, 0x34, 0x0c, 0x07, 0xab, 0xd4, 0x76, 0x1a, 0x39, 0x6d, 0x4c, 0x9b, 0xe8, 0x2b, 0xc9, - 0x1f, 0xb3, 0x87, 0xbf, 0x7c, 0x5c, 0x48, 0xfd, 0xf9, 0xb8, 0x90, 0xc2, 0x8f, 0x34, 0xd0, 0xe3, - 0xd3, 0x4a, 0x94, 0x35, 0x1d, 0x9b, 0x51, 0xb4, 0x05, 0x19, 0xaa, 0x0c, 0x65, 0xd7, 0xb3, 0xe4, - 0xb4, 0xb1, 0xfd, 0x13, 0xe9, 0xe2, 0xa8, 0x21, 0xc9, 0x0c, 0x8f, 0xcc, 0x50, 0x4c, 0xc6, 0x22, - 0xad, 0x2c, 0x38, 0x96, 0x3d, 0x7f, 0xe1, 0xc9, 0xf3, 0x42, 0xea, 0xc7, 0x17, 0x85, 0x73, 0x35, - 0x8b, 0xaf, 0xad, 0xaf, 0x1a, 0x15, 0xa7, 0x61, 0xaa, 0x4c, 0xe4, 0x3f, 0x53, 0xac, 0x7a, 0xc7, - 0xe4, 0xdb, 0x4d, 0xca, 0x5a, 0x73, 0x58, 0xa9, 0x9f, 0x06, 0x09, 0xb0, 0x0e, 0x39, 0xc1, 0x35, - 0x57, 0xe1, 0xd6, 0x06, 0x0d, 0xd1, 0xe1, 0x25, 0x18, 0x6b, 0x67, 0xf3, 0xc9, 0x4f, 0xc0, 0xff, - 0x89, 0x30, 0x07, 0xb8, 0xfb, 0x4a, 0x69, 0x39, 0x26, 0x65, 0xae, 0xc2, 0x11, 0x21, 0x73, 0x99, - 0xd2, 0x2a, 0x75, 0x17, 0x69, 0x9d, 0xd6, 0x44, 0x41, 0xd1, 0x69, 0xc8, 0x6c, 0x90, 0xba, 0x55, - 0x25, 0xdc, 0x71, 0xcb, 0xa4, 0x5a, 0x75, 0x55, 0xf5, 0xfa, 0xfd, 0xd1, 0xb9, 0x6a, 0xd5, 0x0d, - 0x54, 0xf1, 0x5d, 0x38, 0x9e, 0xa8, 0xe4, 0xd3, 0x14, 0x20, 0x7d, 0x4b, 0xd8, 0x82, 0x72, 0x20, - 0x87, 0x3c, 0x2d, 0xbc, 0x00, 0x83, 0x42, 0xe1, 0x7d, 0x8b, 0xb1, 0x05, 0x67, 0xdd, 0xe6, 0xd4, - 0xdd, 0x3d, 0xc6, 0x25, 0x55, 0xb3, 0x80, 0x48, 0xb0, 0x1e, 0x0d, 0x8b, 0xb1, 0x72, 0x45, 0x8e, - 0x0b, 0xa9, 0x03, 0xa5, 0x74, 0x63, 0xc7, 0x15, 0x23, 0xc5, 0xf0, 0x61, 0x9d, 0xb0, 0xb5, 0x1b, - 0x96, 0x5d, 0x75, 0x36, 0xf1, 0x82, 0x92, 0x0c, 0x8c, 0xf9, 0x92, 0xe3, 0x30, 0xb0, 0x29, 0x46, - 0xca, 0x4d, 0xd7, 0xa9, 0xb9, 0x94, 0x31, 0xa5, 0x9a, 0x91, 0xc3, 0xcb, 0x6a, 0xd4, 0x2f, 0xf4, - 0x5c, 0xad, 0xe6, 0x7a, 0x95, 0xa1, 0xcb, 0x2e, 0xdd, 0x70, 0x38, 0xdd, 0x7d, 0x86, 0x9f, 0x6a, - 0xaa, 0xd2, 0x51, 0x29, 0x1f, 0xaa, 0x0c, 0x59, 0xd2, 0xb2, 0x95, 0x9b, 0xd2, 0x28, 0x54, 0xd3, - 0xc5, 0x49, 0x23, 0xbc, 0xe1, 0x0d, 0x5f, 0x24, 0xb8, 0x84, 0x94, 0xe0, 0xfc, 0x01, 0x6f, 0x11, - 0x97, 0x06, 0x49, 0x24, 0x10, 0xce, 0xc1, 0xd1, 0x44, 0x02, 0x86, 0x3f, 0xd7, 0x20, 0x9f, 0x6c, - 0xf2, 0xe9, 0x08, 0xa0, 0x18, 0x5d, 0x6b, 0x4f, 0xed, 0x05, 0x2f, 0x4b, 0x62, 0x14, 0x4b, 0xea, - 0x1c, 0xf0, 0x67, 0x5f, 0xdf, 0x53, 0xa5, 0xb9, 0x3a, 0x17, 0x42, 0x32, 0x7e, 0x1e, 0xd7, 0x21, - 0xb3, 0x93, 0x47, 0xa0, 0xc4, 0xaf, 0xf7, 0x94, 0xc3, 0xf5, 0x9d, 0x04, 0xfa, 0x49, 0x50, 0x1f, - 0x1f, 0x81, 0xa1, 0x78, 0x54, 0x86, 0x37, 0x61, 0x24, 0x61, 0xd8, 0xa7, 0xb9, 0x09, 0x03, 0x61, - 0x9a, 0x56, 0x49, 0x77, 0x8d, 0x93, 0x21, 0xe1, 0xc0, 0xfd, 0x90, 0x16, 0x81, 0x97, 0x89, 0x4b, - 0x1a, 0x0c, 0xbf, 0xa7, 0xf0, 0xe4, 0x4f, 0x3f, 0xfe, 0x0c, 0x1c, 0x6a, 0x8a, 0x11, 0x55, 0x85, - 0xa3, 0xd1, 0xb0, 0xd2, 0x5f, 0xc5, 0x50, 0xbe, 0xfe, 0x42, 0x5a, 0xd9, 0x24, 0xcd, 0x15, 0x97, - 0x54, 0xee, 0x58, 0x76, 0xed, 0x9a, 0xc5, 0x38, 0xc3, 0xcb, 0x6a, 0x1d, 0xc5, 0x2c, 0x7e, 0x44, - 0x03, 0x86, 0xf8, 0x26, 0x69, 0x96, 0xb9, 0xb2, 0x96, 0xeb, 0x9e, 0x59, 0x1d, 0x72, 0x59, 0x1e, - 0x53, 0xdc, 0x82, 0x63, 0x12, 0xdc, 0xb5, 0x2a, 0xf4, 0xaa, 0xc5, 0xb8, 0xe3, 0x6e, 0xcf, 0xf1, - 0x15, 0xab, 0x41, 0x93, 0x6f, 0x08, 0x74, 0x05, 0x0e, 0x78, 0x97, 0x51, 0x6e, 0x9f, 0x48, 0x48, - 0x37, 0xe4, 0x4d, 0x65, 0xb4, 0x6e, 0x2a, 0x63, 0xa5, 0x75, 0x53, 0xcd, 0x1f, 0xf3, 0x92, 0xfa, - 0xfb, 0x79, 0x21, 0xbd, 0x4d, 0x1a, 0xf5, 0x59, 0xec, 0xcd, 0xc2, 0x0f, 0x5e, 0x14, 0xb4, 0x92, - 0x10, 0xc0, 0x3f, 0x69, 0x50, 0x68, 0x13, 0xda, 0xcf, 0x66, 0x3a, 0x88, 0x90, 0x2e, 0x1e, 0x89, - 0x96, 0x6f, 0xd1, 0x33, 0xaa, 0xea, 0x29, 0xbe, 0x1b, 0x30, 0xd4, 0xf4, 0x04, 0xcb, 0x6b, 0x52, - 0xb1, 0x4c, 0x6d, 0xee, 0x6e, 0x2b, 0xdc, 0x13, 0xb1, 0xfa, 0x07, 0x62, 0x2f, 0x79, 0x8e, 0xad, - 0xed, 0xd3, 0x8c, 0x1a, 0x30, 0x87, 0x61, 0xb9, 0xd4, 0xea, 0xf5, 0xe0, 0xac, 0x36, 0x65, 0xba, - 0x0c, 0xb0, 0x73, 0x11, 0xab, 0xe8, 0x67, 0x42, 0x77, 0xa3, 0x7c, 0x70, 0xb4, 0x6e, 0xc8, 0x65, - 0x52, 0xa3, 0x25, 0x7a, 0x77, 0x9d, 0x32, 0x5e, 0x0a, 0xcc, 0xc4, 0xff, 0x68, 0x30, 0x9a, 0x14, - 0xf6, 0xbf, 0x94, 0xe8, 0x23, 0x18, 0x4e, 0x28, 0x11, 0xcb, 0xed, 0x13, 0x5b, 0xa3, 0xe7, 0x1a, - 0xa1, 0x58, 0x8d, 0x18, 0xba, 0x12, 0x4a, 0x7b, 0xbf, 0x40, 0x1a, 0xef, 0x9a, 0xb6, 0x4c, 0x25, - 0x94, 0xf7, 0x5f, 0x1a, 0x9c, 0x94, 0x79, 0xbb, 0x16, 0x5f, 0x6b, 0x50, 0x6e, 0x55, 0xbc, 0x45, - 0x2f, 0x58, 0xe6, 0x29, 0xdf, 0xa4, 0xd4, 0xee, 0xb0, 0x48, 0x6f, 0x02, 0x30, 0x4e, 0x5c, 0x5e, - 0xee, 0x71, 0xa9, 0x1e, 0x57, 0x4b, 0x35, 0x2b, 0x97, 0xea, 0xce, 0x5c, 0xb9, 0x60, 0xfb, 0xc4, - 0x80, 0x88, 0x57, 0x82, 0xc3, 0xd4, 0xae, 0x4a, 0xdd, 0xfd, 0x5d, 0x75, 0x47, 0x94, 0xee, 0x80, - 0xd4, 0x6d, 0xcd, 0x94, 0xaa, 0xff, 0xa3, 0x76, 0xd5, 0x73, 0xc5, 0x5f, 0x68, 0x70, 0xae, 0x87, - 0x5c, 0x03, 0x67, 0x2c, 0x88, 0x3d, 0x2e, 0xea, 0xaf, 0xbe, 0x7b, 0xe7, 0x77, 0xd7, 0x6b, 0xe1, - 0xfc, 0x76, 0x66, 0xe3, 0x52, 0x1f, 0x6f, 0x85, 0x2a, 0xfe, 0x92, 0x85, 0x83, 0x82, 0x03, 0x3d, - 0xd2, 0xa0, 0x3f, 0xfc, 0x5c, 0xc4, 0xd1, 0x55, 0x11, 0x7f, 0x1b, 0xea, 0x67, 0xbb, 0xfb, 0xb4, - 0x72, 0xc0, 0x6f, 0x7c, 0xf6, 0xeb, 0x1f, 0x0f, 0xf7, 0x99, 0x68, 0xca, 0x8c, 0xbc, 0x93, 0xc5, - 0x07, 0x64, 0x66, 0xf8, 0x71, 0x69, 0xde, 0x13, 0xc3, 0xf7, 0xd1, 0xf7, 0x1a, 0x0c, 0x25, 0x3c, - 0xee, 0xd0, 0x44, 0x62, 0xe8, 0x04, 0x4f, 0xfd, 0x7c, 0xaf, 0x9e, 0x3e, 0xea, 0x8c, 0x40, 0x35, - 0xd0, 0x64, 0x1b, 0x54, 0xf5, 0x9a, 0x0c, 0x13, 0xa3, 0x1f, 0x34, 0x40, 0x09, 0x87, 0xea, 0x78, - 0x62, 0xf8, 0xb8, 0xa3, 0x6e, 0xf6, 0xe8, 0xe8, 0x63, 0xbe, 0x29, 0x30, 0x8b, 0xe8, 0x7c, 0x14, - 0x33, 0xb4, 0xd7, 0xcd, 0x04, 0xa6, 0xaf, 0x34, 0x18, 0x88, 0x9e, 0x6a, 0xa7, 0x92, 0xcb, 0x14, - 0xf6, 0xd2, 0x27, 0x7b, 0xf1, 0xf2, 0x09, 0xa7, 0x04, 0xe1, 0x38, 0x3a, 0xdd, 0x99, 0xb0, 0xf5, - 0xad, 0xbf, 0xd6, 0x20, 0x1b, 0xbb, 0xe8, 0xd0, 0x99, 0xc4, 0x90, 0x31, 0x3f, 0xdd, 0xe8, 0xcd, - 0xaf, 0xfb, 0x57, 0x0e, 0xc3, 0x85, 0xef, 0x55, 0xf4, 0x4c, 0x83, 0x7c, 0x97, 0x13, 0xea, 0x42, - 0x72, 0x8d, 0x3a, 0x4e, 0xd2, 0xdf, 0xda, 0xc3, 0x24, 0x3f, 0x95, 0x45, 0x91, 0xca, 0xdb, 0xe8, - 0x62, 0xe7, 0x54, 0xba, 0x70, 0x7f, 0xa7, 0xc1, 0x60, 0xbc, 0x01, 0x4a, 0xe4, 0x8a, 0xba, 0xe9, - 0x53, 0x3d, 0xb9, 0xf9, 0xc0, 0xb3, 0x02, 0x78, 0x06, 0x15, 0xa3, 0xc0, 0xfe, 0x1b, 0x94, 0x99, - 0xf7, 0xc2, 0xaf, 0xd4, 0xfb, 0xa6, 0xec, 0x91, 0xd0, 0x43, 0x0d, 0xd2, 0xc1, 0xde, 0x68, 0x2c, - 0x31, 0x74, 0xc0, 0x43, 0x9f, 0xe8, 0xe6, 0xd1, 0x7d, 0x4b, 0x75, 0xe2, 0xf2, 0x1a, 0x27, 0xf4, - 0x09, 0xa4, 0x03, 0x8d, 0x51, 0x1b, 0xa8, 0x80, 0x47, 0x1b, 0xa8, 0x84, 0xe6, 0x0a, 0x9f, 0x12, - 0x50, 0x79, 0x34, 0x1a, 0x85, 0x62, 0x9e, 0x73, 0x59, 0x76, 0x58, 0xe8, 0x67, 0x0d, 0x06, 0xe3, - 0x5d, 0x55, 0xf2, 0xaa, 0x8a, 0xb8, 0xb5, 0xf9, 0x7a, 0xed, 0x1a, 0x2b, 0xbc, 0x24, 0x80, 0xde, - 0x41, 0x97, 0x76, 0x53, 0xa5, 0x58, 0xb3, 0x83, 0xbe, 0xd1, 0x20, 0x1b, 0xeb, 0x8f, 0xda, 0x6c, - 0xf7, 0x98, 0x5f, 0x9b, 0xed, 0xde, 0xb6, 0xdf, 0x6a, 0x7f, 0xff, 0x04, 0xa0, 0xe3, 0x0d, 0x19, - 0xfa, 0x56, 0x83, 0xfe, 0x70, 0xff, 0x84, 0x3b, 0x07, 0xf6, 0x7c, 0xda, 0x5c, 0x8c, 0x89, 0x0d, - 0x14, 0x9e, 0x17, 0x60, 0x17, 0xd1, 0x6c, 0x02, 0x58, 0xd5, 0xea, 0x5a, 0x4d, 0x51, 0xca, 0x47, - 0x1a, 0x64, 0xc2, 0x1d, 0x11, 0x3a, 0xd9, 0x1d, 0x81, 0xe9, 0xe7, 0x7a, 0x70, 0xf2, 0x41, 0x8b, - 0x02, 0x74, 0x12, 0x9d, 0xed, 0xa9, 0x82, 0xb2, 0x7c, 0xb7, 0xe1, 0x90, 0xec, 0x78, 0xd0, 0x48, - 0xf2, 0xf5, 0x26, 0x8c, 0xfa, 0xc9, 0x0e, 0x46, 0x3f, 0x7e, 0x5e, 0xc4, 0xcf, 0xa1, 0xa3, 0xb1, - 0x53, 0x4e, 0xf6, 0x54, 0xd7, 0x9e, 0xfc, 0x9e, 0x4f, 0x3d, 0x79, 0x99, 0xd7, 0x9e, 0xbe, 0xcc, - 0x6b, 0xbf, 0xbd, 0xcc, 0x6b, 0x0f, 0x5e, 0xe5, 0x53, 0x4f, 0x5f, 0xe5, 0x53, 0xcf, 0x5e, 0xe5, - 0x53, 0x1f, 0x1b, 0x81, 0xbf, 0x40, 0x2d, 0x88, 0x97, 0xd3, 0x82, 0x63, 0x7b, 0x87, 0x3b, 0x67, - 0x52, 0x6f, 0xab, 0xa5, 0x28, 0xfe, 0x1a, 0xb5, 0x7a, 0x48, 0xbc, 0xee, 0x2e, 0xfc, 0x1b, 0x00, - 0x00, 0xff, 0xff, 0xaa, 0x29, 0x63, 0x18, 0x37, 0x14, 0x00, 0x00, -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 - -// QueryClient is the client API for Query service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type QueryClient interface { - // ExchangeRates returns exchange rates of all denoms, - // or, if specified, returns a single denom - ExchangeRates(ctx context.Context, in *QueryExchangeRates, opts ...grpc.CallOption) (*QueryExchangeRatesResponse, error) - // ActiveExchangeRates returns all active denoms - ActiveExchangeRates(ctx context.Context, in *QueryActiveExchangeRates, opts ...grpc.CallOption) (*QueryActiveExchangeRatesResponse, error) - // PriceHistoryAtTime return price of denom at specific time - PriceHistoryAtTime(ctx context.Context, in *QueryPriceHistoryAtTime, opts ...grpc.CallOption) (*QueryPriceHistoryAtTimeResponse, error) - // AllPriceHistory return all price history of denom - AllPriceHistory(ctx context.Context, in *QueryAllPriceHistory, opts ...grpc.CallOption) (*QueryAllPriceHistoryResponse, error) - // TwapTrackingLists return all price tracking denom - TwapTrackingLists(ctx context.Context, in *QueryTwapTrackingLists, opts ...grpc.CallOption) (*QueryTwapTrackingListsResponse, error) - // ArithmeticTwapPriceBetweenTime return denom twap price between startTime - // and endTime - ArithmeticTwapPriceBetweenTime(ctx context.Context, in *QueryArithmeticTwapPriceBetweenTime, opts ...grpc.CallOption) (*QueryArithmeticTwapPriceBetweenTimeResponse, error) - // FeederDelegation returns feeder delegation of a validator - FeederDelegation(ctx context.Context, in *QueryFeederDelegation, opts ...grpc.CallOption) (*QueryFeederDelegationResponse, error) - // MissCounter returns oracle miss counter of a validator - MissCounter(ctx context.Context, in *QueryMissCounter, opts ...grpc.CallOption) (*QueryMissCounterResponse, error) - // SlashWindow returns slash window information - SlashWindow(ctx context.Context, in *QuerySlashWindow, opts ...grpc.CallOption) (*QuerySlashWindowResponse, error) - // AggregatePrevote returns an aggregate prevote of a validator - AggregatePrevote(ctx context.Context, in *QueryAggregatePrevote, opts ...grpc.CallOption) (*QueryAggregatePrevoteResponse, error) - // AggregatePrevotes returns aggregate prevotes of all validators - AggregatePrevotes(ctx context.Context, in *QueryAggregatePrevotes, opts ...grpc.CallOption) (*QueryAggregatePrevotesResponse, error) - // AggregateVote returns an aggregate vote of a validator - AggregateVote(ctx context.Context, in *QueryAggregateVote, opts ...grpc.CallOption) (*QueryAggregateVoteResponse, error) - // AggregateVotes returns aggregate votes of all validators - AggregateVotes(ctx context.Context, in *QueryAggregateVotes, opts ...grpc.CallOption) (*QueryAggregateVotesResponse, error) - // Params queries all parameters. - Params(ctx context.Context, in *QueryParams, opts ...grpc.CallOption) (*QueryParamsResponse, error) -} - -type queryClient struct { - cc grpc1.ClientConn -} - -func NewQueryClient(cc grpc1.ClientConn) QueryClient { - return &queryClient{cc} -} - -func (c *queryClient) ExchangeRates(ctx context.Context, in *QueryExchangeRates, opts ...grpc.CallOption) (*QueryExchangeRatesResponse, error) { - out := new(QueryExchangeRatesResponse) - err := c.cc.Invoke(ctx, "/juno.oracle.v1.Query/ExchangeRates", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) ActiveExchangeRates(ctx context.Context, in *QueryActiveExchangeRates, opts ...grpc.CallOption) (*QueryActiveExchangeRatesResponse, error) { - out := new(QueryActiveExchangeRatesResponse) - err := c.cc.Invoke(ctx, "/juno.oracle.v1.Query/ActiveExchangeRates", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) PriceHistoryAtTime(ctx context.Context, in *QueryPriceHistoryAtTime, opts ...grpc.CallOption) (*QueryPriceHistoryAtTimeResponse, error) { - out := new(QueryPriceHistoryAtTimeResponse) - err := c.cc.Invoke(ctx, "/juno.oracle.v1.Query/PriceHistoryAtTime", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) AllPriceHistory(ctx context.Context, in *QueryAllPriceHistory, opts ...grpc.CallOption) (*QueryAllPriceHistoryResponse, error) { - out := new(QueryAllPriceHistoryResponse) - err := c.cc.Invoke(ctx, "/juno.oracle.v1.Query/AllPriceHistory", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) TwapTrackingLists(ctx context.Context, in *QueryTwapTrackingLists, opts ...grpc.CallOption) (*QueryTwapTrackingListsResponse, error) { - out := new(QueryTwapTrackingListsResponse) - err := c.cc.Invoke(ctx, "/juno.oracle.v1.Query/TwapTrackingLists", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) ArithmeticTwapPriceBetweenTime(ctx context.Context, in *QueryArithmeticTwapPriceBetweenTime, opts ...grpc.CallOption) (*QueryArithmeticTwapPriceBetweenTimeResponse, error) { - out := new(QueryArithmeticTwapPriceBetweenTimeResponse) - err := c.cc.Invoke(ctx, "/juno.oracle.v1.Query/ArithmeticTwapPriceBetweenTime", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) FeederDelegation(ctx context.Context, in *QueryFeederDelegation, opts ...grpc.CallOption) (*QueryFeederDelegationResponse, error) { - out := new(QueryFeederDelegationResponse) - err := c.cc.Invoke(ctx, "/juno.oracle.v1.Query/FeederDelegation", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) MissCounter(ctx context.Context, in *QueryMissCounter, opts ...grpc.CallOption) (*QueryMissCounterResponse, error) { - out := new(QueryMissCounterResponse) - err := c.cc.Invoke(ctx, "/juno.oracle.v1.Query/MissCounter", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) SlashWindow(ctx context.Context, in *QuerySlashWindow, opts ...grpc.CallOption) (*QuerySlashWindowResponse, error) { - out := new(QuerySlashWindowResponse) - err := c.cc.Invoke(ctx, "/juno.oracle.v1.Query/SlashWindow", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) AggregatePrevote(ctx context.Context, in *QueryAggregatePrevote, opts ...grpc.CallOption) (*QueryAggregatePrevoteResponse, error) { - out := new(QueryAggregatePrevoteResponse) - err := c.cc.Invoke(ctx, "/juno.oracle.v1.Query/AggregatePrevote", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) AggregatePrevotes(ctx context.Context, in *QueryAggregatePrevotes, opts ...grpc.CallOption) (*QueryAggregatePrevotesResponse, error) { - out := new(QueryAggregatePrevotesResponse) - err := c.cc.Invoke(ctx, "/juno.oracle.v1.Query/AggregatePrevotes", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) AggregateVote(ctx context.Context, in *QueryAggregateVote, opts ...grpc.CallOption) (*QueryAggregateVoteResponse, error) { - out := new(QueryAggregateVoteResponse) - err := c.cc.Invoke(ctx, "/juno.oracle.v1.Query/AggregateVote", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) AggregateVotes(ctx context.Context, in *QueryAggregateVotes, opts ...grpc.CallOption) (*QueryAggregateVotesResponse, error) { - out := new(QueryAggregateVotesResponse) - err := c.cc.Invoke(ctx, "/juno.oracle.v1.Query/AggregateVotes", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) Params(ctx context.Context, in *QueryParams, opts ...grpc.CallOption) (*QueryParamsResponse, error) { - out := new(QueryParamsResponse) - err := c.cc.Invoke(ctx, "/juno.oracle.v1.Query/Params", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// QueryServer is the server API for Query service. -type QueryServer interface { - // ExchangeRates returns exchange rates of all denoms, - // or, if specified, returns a single denom - ExchangeRates(context.Context, *QueryExchangeRates) (*QueryExchangeRatesResponse, error) - // ActiveExchangeRates returns all active denoms - ActiveExchangeRates(context.Context, *QueryActiveExchangeRates) (*QueryActiveExchangeRatesResponse, error) - // PriceHistoryAtTime return price of denom at specific time - PriceHistoryAtTime(context.Context, *QueryPriceHistoryAtTime) (*QueryPriceHistoryAtTimeResponse, error) - // AllPriceHistory return all price history of denom - AllPriceHistory(context.Context, *QueryAllPriceHistory) (*QueryAllPriceHistoryResponse, error) - // TwapTrackingLists return all price tracking denom - TwapTrackingLists(context.Context, *QueryTwapTrackingLists) (*QueryTwapTrackingListsResponse, error) - // ArithmeticTwapPriceBetweenTime return denom twap price between startTime - // and endTime - ArithmeticTwapPriceBetweenTime(context.Context, *QueryArithmeticTwapPriceBetweenTime) (*QueryArithmeticTwapPriceBetweenTimeResponse, error) - // FeederDelegation returns feeder delegation of a validator - FeederDelegation(context.Context, *QueryFeederDelegation) (*QueryFeederDelegationResponse, error) - // MissCounter returns oracle miss counter of a validator - MissCounter(context.Context, *QueryMissCounter) (*QueryMissCounterResponse, error) - // SlashWindow returns slash window information - SlashWindow(context.Context, *QuerySlashWindow) (*QuerySlashWindowResponse, error) - // AggregatePrevote returns an aggregate prevote of a validator - AggregatePrevote(context.Context, *QueryAggregatePrevote) (*QueryAggregatePrevoteResponse, error) - // AggregatePrevotes returns aggregate prevotes of all validators - AggregatePrevotes(context.Context, *QueryAggregatePrevotes) (*QueryAggregatePrevotesResponse, error) - // AggregateVote returns an aggregate vote of a validator - AggregateVote(context.Context, *QueryAggregateVote) (*QueryAggregateVoteResponse, error) - // AggregateVotes returns aggregate votes of all validators - AggregateVotes(context.Context, *QueryAggregateVotes) (*QueryAggregateVotesResponse, error) - // Params queries all parameters. - Params(context.Context, *QueryParams) (*QueryParamsResponse, error) -} - -// UnimplementedQueryServer can be embedded to have forward compatible implementations. -type UnimplementedQueryServer struct { -} - -func (*UnimplementedQueryServer) ExchangeRates(ctx context.Context, req *QueryExchangeRates) (*QueryExchangeRatesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ExchangeRates not implemented") -} -func (*UnimplementedQueryServer) ActiveExchangeRates(ctx context.Context, req *QueryActiveExchangeRates) (*QueryActiveExchangeRatesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ActiveExchangeRates not implemented") -} -func (*UnimplementedQueryServer) PriceHistoryAtTime(ctx context.Context, req *QueryPriceHistoryAtTime) (*QueryPriceHistoryAtTimeResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method PriceHistoryAtTime not implemented") -} -func (*UnimplementedQueryServer) AllPriceHistory(ctx context.Context, req *QueryAllPriceHistory) (*QueryAllPriceHistoryResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method AllPriceHistory not implemented") -} -func (*UnimplementedQueryServer) TwapTrackingLists(ctx context.Context, req *QueryTwapTrackingLists) (*QueryTwapTrackingListsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method TwapTrackingLists not implemented") -} -func (*UnimplementedQueryServer) ArithmeticTwapPriceBetweenTime(ctx context.Context, req *QueryArithmeticTwapPriceBetweenTime) (*QueryArithmeticTwapPriceBetweenTimeResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ArithmeticTwapPriceBetweenTime not implemented") -} -func (*UnimplementedQueryServer) FeederDelegation(ctx context.Context, req *QueryFeederDelegation) (*QueryFeederDelegationResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method FeederDelegation not implemented") -} -func (*UnimplementedQueryServer) MissCounter(ctx context.Context, req *QueryMissCounter) (*QueryMissCounterResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method MissCounter not implemented") -} -func (*UnimplementedQueryServer) SlashWindow(ctx context.Context, req *QuerySlashWindow) (*QuerySlashWindowResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method SlashWindow not implemented") -} -func (*UnimplementedQueryServer) AggregatePrevote(ctx context.Context, req *QueryAggregatePrevote) (*QueryAggregatePrevoteResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method AggregatePrevote not implemented") -} -func (*UnimplementedQueryServer) AggregatePrevotes(ctx context.Context, req *QueryAggregatePrevotes) (*QueryAggregatePrevotesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method AggregatePrevotes not implemented") -} -func (*UnimplementedQueryServer) AggregateVote(ctx context.Context, req *QueryAggregateVote) (*QueryAggregateVoteResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method AggregateVote not implemented") -} -func (*UnimplementedQueryServer) AggregateVotes(ctx context.Context, req *QueryAggregateVotes) (*QueryAggregateVotesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method AggregateVotes not implemented") -} -func (*UnimplementedQueryServer) Params(ctx context.Context, req *QueryParams) (*QueryParamsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Params not implemented") -} - -func RegisterQueryServer(s grpc1.Server, srv QueryServer) { - s.RegisterService(&_Query_serviceDesc, srv) -} - -func _Query_ExchangeRates_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryExchangeRates) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).ExchangeRates(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/juno.oracle.v1.Query/ExchangeRates", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).ExchangeRates(ctx, req.(*QueryExchangeRates)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_ActiveExchangeRates_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryActiveExchangeRates) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).ActiveExchangeRates(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/juno.oracle.v1.Query/ActiveExchangeRates", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).ActiveExchangeRates(ctx, req.(*QueryActiveExchangeRates)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_PriceHistoryAtTime_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryPriceHistoryAtTime) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).PriceHistoryAtTime(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/juno.oracle.v1.Query/PriceHistoryAtTime", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).PriceHistoryAtTime(ctx, req.(*QueryPriceHistoryAtTime)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_AllPriceHistory_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryAllPriceHistory) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).AllPriceHistory(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/juno.oracle.v1.Query/AllPriceHistory", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).AllPriceHistory(ctx, req.(*QueryAllPriceHistory)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_TwapTrackingLists_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryTwapTrackingLists) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).TwapTrackingLists(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/juno.oracle.v1.Query/TwapTrackingLists", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).TwapTrackingLists(ctx, req.(*QueryTwapTrackingLists)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_ArithmeticTwapPriceBetweenTime_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryArithmeticTwapPriceBetweenTime) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).ArithmeticTwapPriceBetweenTime(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/juno.oracle.v1.Query/ArithmeticTwapPriceBetweenTime", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).ArithmeticTwapPriceBetweenTime(ctx, req.(*QueryArithmeticTwapPriceBetweenTime)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_FeederDelegation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryFeederDelegation) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).FeederDelegation(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/juno.oracle.v1.Query/FeederDelegation", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).FeederDelegation(ctx, req.(*QueryFeederDelegation)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_MissCounter_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryMissCounter) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).MissCounter(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/juno.oracle.v1.Query/MissCounter", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).MissCounter(ctx, req.(*QueryMissCounter)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_SlashWindow_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QuerySlashWindow) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).SlashWindow(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/juno.oracle.v1.Query/SlashWindow", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).SlashWindow(ctx, req.(*QuerySlashWindow)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_AggregatePrevote_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryAggregatePrevote) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).AggregatePrevote(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/juno.oracle.v1.Query/AggregatePrevote", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).AggregatePrevote(ctx, req.(*QueryAggregatePrevote)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_AggregatePrevotes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryAggregatePrevotes) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).AggregatePrevotes(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/juno.oracle.v1.Query/AggregatePrevotes", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).AggregatePrevotes(ctx, req.(*QueryAggregatePrevotes)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_AggregateVote_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryAggregateVote) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).AggregateVote(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/juno.oracle.v1.Query/AggregateVote", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).AggregateVote(ctx, req.(*QueryAggregateVote)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_AggregateVotes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryAggregateVotes) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).AggregateVotes(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/juno.oracle.v1.Query/AggregateVotes", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).AggregateVotes(ctx, req.(*QueryAggregateVotes)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_Params_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryParams) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).Params(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/juno.oracle.v1.Query/Params", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).Params(ctx, req.(*QueryParams)) - } - return interceptor(ctx, in, info, handler) -} - -var _Query_serviceDesc = grpc.ServiceDesc{ - ServiceName: "juno.oracle.v1.Query", - HandlerType: (*QueryServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "ExchangeRates", - Handler: _Query_ExchangeRates_Handler, - }, - { - MethodName: "ActiveExchangeRates", - Handler: _Query_ActiveExchangeRates_Handler, - }, - { - MethodName: "PriceHistoryAtTime", - Handler: _Query_PriceHistoryAtTime_Handler, - }, - { - MethodName: "AllPriceHistory", - Handler: _Query_AllPriceHistory_Handler, - }, - { - MethodName: "TwapTrackingLists", - Handler: _Query_TwapTrackingLists_Handler, - }, - { - MethodName: "ArithmeticTwapPriceBetweenTime", - Handler: _Query_ArithmeticTwapPriceBetweenTime_Handler, - }, - { - MethodName: "FeederDelegation", - Handler: _Query_FeederDelegation_Handler, - }, - { - MethodName: "MissCounter", - Handler: _Query_MissCounter_Handler, - }, - { - MethodName: "SlashWindow", - Handler: _Query_SlashWindow_Handler, - }, - { - MethodName: "AggregatePrevote", - Handler: _Query_AggregatePrevote_Handler, - }, - { - MethodName: "AggregatePrevotes", - Handler: _Query_AggregatePrevotes_Handler, - }, - { - MethodName: "AggregateVote", - Handler: _Query_AggregateVote_Handler, - }, - { - MethodName: "AggregateVotes", - Handler: _Query_AggregateVotes_Handler, - }, - { - MethodName: "Params", - Handler: _Query_Params_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "juno/oracle/v1/query.proto", -} - -func (m *QueryExchangeRates) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryExchangeRates) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryExchangeRates) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Denom) > 0 { - i -= len(m.Denom) - copy(dAtA[i:], m.Denom) - i = encodeVarintQuery(dAtA, i, uint64(len(m.Denom))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *QueryExchangeRatesResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryExchangeRatesResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryExchangeRatesResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.ExchangeRates) > 0 { - for iNdEx := len(m.ExchangeRates) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.ExchangeRates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *QueryActiveExchangeRates) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryActiveExchangeRates) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryActiveExchangeRates) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *QueryActiveExchangeRatesResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryActiveExchangeRatesResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryActiveExchangeRatesResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.ActiveRates) > 0 { - for iNdEx := len(m.ActiveRates) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.ActiveRates[iNdEx]) - copy(dAtA[i:], m.ActiveRates[iNdEx]) - i = encodeVarintQuery(dAtA, i, uint64(len(m.ActiveRates[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *QueryFeederDelegation) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryFeederDelegation) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryFeederDelegation) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.ValidatorAddr) > 0 { - i -= len(m.ValidatorAddr) - copy(dAtA[i:], m.ValidatorAddr) - i = encodeVarintQuery(dAtA, i, uint64(len(m.ValidatorAddr))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *QueryFeederDelegationResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryFeederDelegationResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryFeederDelegationResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.FeederAddr) > 0 { - i -= len(m.FeederAddr) - copy(dAtA[i:], m.FeederAddr) - i = encodeVarintQuery(dAtA, i, uint64(len(m.FeederAddr))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *QueryMissCounter) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryMissCounter) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryMissCounter) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.ValidatorAddr) > 0 { - i -= len(m.ValidatorAddr) - copy(dAtA[i:], m.ValidatorAddr) - i = encodeVarintQuery(dAtA, i, uint64(len(m.ValidatorAddr))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *QueryMissCounterResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryMissCounterResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryMissCounterResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.MissCounter != 0 { - i = encodeVarintQuery(dAtA, i, uint64(m.MissCounter)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *QuerySlashWindow) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QuerySlashWindow) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QuerySlashWindow) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *QuerySlashWindowResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QuerySlashWindowResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QuerySlashWindowResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.WindowProgress != 0 { - i = encodeVarintQuery(dAtA, i, uint64(m.WindowProgress)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *QueryAggregatePrevote) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryAggregatePrevote) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryAggregatePrevote) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.ValidatorAddr) > 0 { - i -= len(m.ValidatorAddr) - copy(dAtA[i:], m.ValidatorAddr) - i = encodeVarintQuery(dAtA, i, uint64(len(m.ValidatorAddr))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *QueryAggregatePrevoteResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryAggregatePrevoteResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryAggregatePrevoteResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.AggregatePrevote.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *QueryAggregatePrevotes) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryAggregatePrevotes) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryAggregatePrevotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *QueryAggregatePrevotesResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryAggregatePrevotesResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryAggregatePrevotesResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.AggregatePrevotes) > 0 { - for iNdEx := len(m.AggregatePrevotes) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.AggregatePrevotes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *QueryAggregateVote) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryAggregateVote) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryAggregateVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.ValidatorAddr) > 0 { - i -= len(m.ValidatorAddr) - copy(dAtA[i:], m.ValidatorAddr) - i = encodeVarintQuery(dAtA, i, uint64(len(m.ValidatorAddr))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *QueryAggregateVoteResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryAggregateVoteResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryAggregateVoteResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.AggregateVote.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *QueryAggregateVotes) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryAggregateVotes) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryAggregateVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *QueryAggregateVotesResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryAggregateVotesResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryAggregateVotesResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.AggregateVotes) > 0 { - for iNdEx := len(m.AggregateVotes) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.AggregateVotes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *QueryParams) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryParams) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *QueryParamsResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryParamsResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *QueryTwapTrackingLists) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryTwapTrackingLists) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryTwapTrackingLists) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *QueryTwapTrackingListsResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryTwapTrackingListsResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryTwapTrackingListsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.TwapTrackingLists) > 0 { - for iNdEx := len(m.TwapTrackingLists) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.TwapTrackingLists[iNdEx]) - copy(dAtA[i:], m.TwapTrackingLists[iNdEx]) - i = encodeVarintQuery(dAtA, i, uint64(len(m.TwapTrackingLists[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *QueryPriceHistoryAtTime) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryPriceHistoryAtTime) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryPriceHistoryAtTime) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - n4, err4 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) - if err4 != nil { - return 0, err4 - } - i -= n4 - i = encodeVarintQuery(dAtA, i, uint64(n4)) - i-- - dAtA[i] = 0x12 - if len(m.Denom) > 0 { - i -= len(m.Denom) - copy(dAtA[i:], m.Denom) - i = encodeVarintQuery(dAtA, i, uint64(len(m.Denom))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *QueryPriceHistoryAtTimeResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryPriceHistoryAtTimeResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryPriceHistoryAtTimeResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.PriceHistoryEntry.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size, err := m.Denom.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *QueryAllPriceHistory) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryAllPriceHistory) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryAllPriceHistory) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Pagination != nil { - { - size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if len(m.Denom) > 0 { - i -= len(m.Denom) - copy(dAtA[i:], m.Denom) - i = encodeVarintQuery(dAtA, i, uint64(len(m.Denom))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *QueryAllPriceHistoryResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryAllPriceHistoryResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryAllPriceHistoryResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Pagination != nil { - { - size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - if len(m.PriceHistoryEntrys) > 0 { - for iNdEx := len(m.PriceHistoryEntrys) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.PriceHistoryEntrys[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - { - size, err := m.Denom.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *QueryArithmeticTwapPriceBetweenTime) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryArithmeticTwapPriceBetweenTime) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryArithmeticTwapPriceBetweenTime) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - n10, err10 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.EndTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.EndTime):]) - if err10 != nil { - return 0, err10 - } - i -= n10 - i = encodeVarintQuery(dAtA, i, uint64(n10)) - i-- - dAtA[i] = 0x1a - n11, err11 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) - if err11 != nil { - return 0, err11 - } - i -= n11 - i = encodeVarintQuery(dAtA, i, uint64(n11)) - i-- - dAtA[i] = 0x12 - if len(m.Denom) > 0 { - i -= len(m.Denom) - copy(dAtA[i:], m.Denom) - i = encodeVarintQuery(dAtA, i, uint64(len(m.Denom))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *QueryArithmeticTwapPriceBetweenTimeResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryArithmeticTwapPriceBetweenTimeResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryArithmeticTwapPriceBetweenTimeResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.TwapPrice.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { - offset -= sovQuery(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *QueryExchangeRates) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Denom) - if l > 0 { - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QueryExchangeRatesResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.ExchangeRates) > 0 { - for _, e := range m.ExchangeRates { - l = e.Size() - n += 1 + l + sovQuery(uint64(l)) - } - } - return n -} - -func (m *QueryActiveExchangeRates) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *QueryActiveExchangeRatesResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.ActiveRates) > 0 { - for _, s := range m.ActiveRates { - l = len(s) - n += 1 + l + sovQuery(uint64(l)) - } - } - return n -} - -func (m *QueryFeederDelegation) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ValidatorAddr) - if l > 0 { - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QueryFeederDelegationResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.FeederAddr) - if l > 0 { - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QueryMissCounter) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ValidatorAddr) - if l > 0 { - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QueryMissCounterResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.MissCounter != 0 { - n += 1 + sovQuery(uint64(m.MissCounter)) - } - return n -} - -func (m *QuerySlashWindow) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *QuerySlashWindowResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.WindowProgress != 0 { - n += 1 + sovQuery(uint64(m.WindowProgress)) - } - return n -} - -func (m *QueryAggregatePrevote) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ValidatorAddr) - if l > 0 { - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QueryAggregatePrevoteResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.AggregatePrevote.Size() - n += 1 + l + sovQuery(uint64(l)) - return n -} - -func (m *QueryAggregatePrevotes) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *QueryAggregatePrevotesResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.AggregatePrevotes) > 0 { - for _, e := range m.AggregatePrevotes { - l = e.Size() - n += 1 + l + sovQuery(uint64(l)) - } - } - return n -} - -func (m *QueryAggregateVote) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ValidatorAddr) - if l > 0 { - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QueryAggregateVoteResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.AggregateVote.Size() - n += 1 + l + sovQuery(uint64(l)) - return n -} - -func (m *QueryAggregateVotes) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *QueryAggregateVotesResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.AggregateVotes) > 0 { - for _, e := range m.AggregateVotes { - l = e.Size() - n += 1 + l + sovQuery(uint64(l)) - } - } - return n -} - -func (m *QueryParams) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *QueryParamsResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Params.Size() - n += 1 + l + sovQuery(uint64(l)) - return n -} - -func (m *QueryTwapTrackingLists) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *QueryTwapTrackingListsResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.TwapTrackingLists) > 0 { - for _, s := range m.TwapTrackingLists { - l = len(s) - n += 1 + l + sovQuery(uint64(l)) - } - } - return n -} - -func (m *QueryPriceHistoryAtTime) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Denom) - if l > 0 { - n += 1 + l + sovQuery(uint64(l)) - } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.Time) - n += 1 + l + sovQuery(uint64(l)) - return n -} - -func (m *QueryPriceHistoryAtTimeResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Denom.Size() - n += 1 + l + sovQuery(uint64(l)) - l = m.PriceHistoryEntry.Size() - n += 1 + l + sovQuery(uint64(l)) - return n -} - -func (m *QueryAllPriceHistory) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Denom) - if l > 0 { - n += 1 + l + sovQuery(uint64(l)) - } - if m.Pagination != nil { - l = m.Pagination.Size() - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QueryAllPriceHistoryResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Denom.Size() - n += 1 + l + sovQuery(uint64(l)) - if len(m.PriceHistoryEntrys) > 0 { - for _, e := range m.PriceHistoryEntrys { - l = e.Size() - n += 1 + l + sovQuery(uint64(l)) - } - } - if m.Pagination != nil { - l = m.Pagination.Size() - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QueryArithmeticTwapPriceBetweenTime) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Denom) - if l > 0 { - n += 1 + l + sovQuery(uint64(l)) - } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime) - n += 1 + l + sovQuery(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.EndTime) - n += 1 + l + sovQuery(uint64(l)) - return n -} - -func (m *QueryArithmeticTwapPriceBetweenTimeResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.TwapPrice.Size() - n += 1 + l + sovQuery(uint64(l)) - return n -} - -func sovQuery(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozQuery(x uint64) (n int) { - return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *QueryExchangeRates) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryExchangeRates: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryExchangeRates: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Denom", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Denom = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryExchangeRatesResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryExchangeRatesResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryExchangeRatesResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExchangeRates", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ExchangeRates = append(m.ExchangeRates, types.DecCoin{}) - if err := m.ExchangeRates[len(m.ExchangeRates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryActiveExchangeRates) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryActiveExchangeRates: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryActiveExchangeRates: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryActiveExchangeRatesResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryActiveExchangeRatesResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryActiveExchangeRatesResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ActiveRates", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ActiveRates = append(m.ActiveRates, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryFeederDelegation) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryFeederDelegation: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryFeederDelegation: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorAddr", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ValidatorAddr = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryFeederDelegationResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryFeederDelegationResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryFeederDelegationResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FeederAddr", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.FeederAddr = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryMissCounter) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryMissCounter: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryMissCounter: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorAddr", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ValidatorAddr = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryMissCounterResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryMissCounterResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryMissCounterResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field MissCounter", wireType) - } - m.MissCounter = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.MissCounter |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QuerySlashWindow) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QuerySlashWindow: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QuerySlashWindow: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QuerySlashWindowResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QuerySlashWindowResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QuerySlashWindowResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field WindowProgress", wireType) - } - m.WindowProgress = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.WindowProgress |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryAggregatePrevote) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryAggregatePrevote: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryAggregatePrevote: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorAddr", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ValidatorAddr = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryAggregatePrevoteResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryAggregatePrevoteResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryAggregatePrevoteResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AggregatePrevote", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.AggregatePrevote.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryAggregatePrevotes) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryAggregatePrevotes: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryAggregatePrevotes: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryAggregatePrevotesResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryAggregatePrevotesResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryAggregatePrevotesResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AggregatePrevotes", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.AggregatePrevotes = append(m.AggregatePrevotes, AggregateExchangeRatePrevote{}) - if err := m.AggregatePrevotes[len(m.AggregatePrevotes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryAggregateVote) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryAggregateVote: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryAggregateVote: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorAddr", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ValidatorAddr = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryAggregateVoteResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryAggregateVoteResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryAggregateVoteResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AggregateVote", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.AggregateVote.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryAggregateVotes) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryAggregateVotes: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryAggregateVotes: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryAggregateVotesResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryAggregateVotesResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryAggregateVotesResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AggregateVotes", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.AggregateVotes = append(m.AggregateVotes, AggregateExchangeRateVote{}) - if err := m.AggregateVotes[len(m.AggregateVotes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryParams) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryParams: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryParams: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryParamsResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryParamsResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryParamsResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryTwapTrackingLists) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryTwapTrackingLists: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryTwapTrackingLists: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryTwapTrackingListsResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryTwapTrackingListsResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryTwapTrackingListsResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TwapTrackingLists", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TwapTrackingLists = append(m.TwapTrackingLists, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryPriceHistoryAtTime) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryPriceHistoryAtTime: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryPriceHistoryAtTime: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Denom", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Denom = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Time", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Time, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryPriceHistoryAtTimeResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryPriceHistoryAtTimeResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryPriceHistoryAtTimeResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Denom", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Denom.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PriceHistoryEntry", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.PriceHistoryEntry.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryAllPriceHistory) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryAllPriceHistory: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryAllPriceHistory: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Denom", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Denom = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Pagination == nil { - m.Pagination = &query.PageRequest{} - } - if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryAllPriceHistoryResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryAllPriceHistoryResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryAllPriceHistoryResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Denom", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Denom.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PriceHistoryEntrys", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.PriceHistoryEntrys = append(m.PriceHistoryEntrys, PriceHistoryEntry{}) - if err := m.PriceHistoryEntrys[len(m.PriceHistoryEntrys)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Pagination == nil { - m.Pagination = &query.PageResponse{} - } - if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryArithmeticTwapPriceBetweenTime) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryArithmeticTwapPriceBetweenTime: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryArithmeticTwapPriceBetweenTime: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Denom", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Denom = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StartTime", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.StartTime, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EndTime", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.EndTime, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryArithmeticTwapPriceBetweenTimeResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryArithmeticTwapPriceBetweenTimeResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryArithmeticTwapPriceBetweenTimeResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TwapPrice", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.TwapPrice.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipQuery(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowQuery - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowQuery - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowQuery - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthQuery - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupQuery - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthQuery - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthQuery = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowQuery = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupQuery = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/oracle/types/query.pb.gw.go b/x/oracle/types/query.pb.gw.go deleted file mode 100644 index 0ad032b1d..000000000 --- a/x/oracle/types/query.pb.gw.go +++ /dev/null @@ -1,1268 +0,0 @@ -// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. -// source: juno/oracle/v1/query.proto - -/* -Package types is a reverse proxy. - -It translates gRPC into RESTful JSON APIs. -*/ -package types - -import ( - "context" - "io" - "net/http" - - "github.com/golang/protobuf/descriptor" - "github.com/golang/protobuf/proto" - "github.com/grpc-ecosystem/grpc-gateway/runtime" - "github.com/grpc-ecosystem/grpc-gateway/utilities" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/status" -) - -// Suppress "imported and not used" errors -var _ codes.Code -var _ io.Reader -var _ status.Status -var _ = runtime.String -var _ = utilities.NewDoubleArray -var _ = descriptor.ForMessage -var _ = metadata.Join - -func request_Query_ExchangeRates_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryExchangeRates - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["denom"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "denom") - } - - protoReq.Denom, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "denom", err) - } - - msg, err := client.ExchangeRates(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_ExchangeRates_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryExchangeRates - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["denom"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "denom") - } - - protoReq.Denom, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "denom", err) - } - - msg, err := server.ExchangeRates(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_ActiveExchangeRates_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryActiveExchangeRates - var metadata runtime.ServerMetadata - - msg, err := client.ActiveExchangeRates(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_ActiveExchangeRates_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryActiveExchangeRates - var metadata runtime.ServerMetadata - - msg, err := server.ActiveExchangeRates(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_Query_PriceHistoryAtTime_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_Query_PriceHistoryAtTime_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryPriceHistoryAtTime - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_PriceHistoryAtTime_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.PriceHistoryAtTime(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_PriceHistoryAtTime_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryPriceHistoryAtTime - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_PriceHistoryAtTime_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.PriceHistoryAtTime(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_Query_AllPriceHistory_0 = &utilities.DoubleArray{Encoding: map[string]int{"denom": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) - -func request_Query_AllPriceHistory_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryAllPriceHistory - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["denom"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "denom") - } - - protoReq.Denom, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "denom", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_AllPriceHistory_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.AllPriceHistory(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_AllPriceHistory_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryAllPriceHistory - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["denom"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "denom") - } - - protoReq.Denom, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "denom", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_AllPriceHistory_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.AllPriceHistory(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_TwapTrackingLists_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryTwapTrackingLists - var metadata runtime.ServerMetadata - - msg, err := client.TwapTrackingLists(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_TwapTrackingLists_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryTwapTrackingLists - var metadata runtime.ServerMetadata - - msg, err := server.TwapTrackingLists(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_Query_ArithmeticTwapPriceBetweenTime_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_Query_ArithmeticTwapPriceBetweenTime_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryArithmeticTwapPriceBetweenTime - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ArithmeticTwapPriceBetweenTime_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.ArithmeticTwapPriceBetweenTime(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_ArithmeticTwapPriceBetweenTime_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryArithmeticTwapPriceBetweenTime - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ArithmeticTwapPriceBetweenTime_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.ArithmeticTwapPriceBetweenTime(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_FeederDelegation_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryFeederDelegation - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["validator_addr"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_addr") - } - - protoReq.ValidatorAddr, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_addr", err) - } - - msg, err := client.FeederDelegation(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_FeederDelegation_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryFeederDelegation - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["validator_addr"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_addr") - } - - protoReq.ValidatorAddr, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_addr", err) - } - - msg, err := server.FeederDelegation(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_MissCounter_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryMissCounter - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["validator_addr"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_addr") - } - - protoReq.ValidatorAddr, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_addr", err) - } - - msg, err := client.MissCounter(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_MissCounter_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryMissCounter - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["validator_addr"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_addr") - } - - protoReq.ValidatorAddr, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_addr", err) - } - - msg, err := server.MissCounter(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_SlashWindow_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QuerySlashWindow - var metadata runtime.ServerMetadata - - msg, err := client.SlashWindow(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_SlashWindow_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QuerySlashWindow - var metadata runtime.ServerMetadata - - msg, err := server.SlashWindow(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_AggregatePrevote_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryAggregatePrevote - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["validator_addr"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_addr") - } - - protoReq.ValidatorAddr, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_addr", err) - } - - msg, err := client.AggregatePrevote(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_AggregatePrevote_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryAggregatePrevote - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["validator_addr"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_addr") - } - - protoReq.ValidatorAddr, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_addr", err) - } - - msg, err := server.AggregatePrevote(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_AggregatePrevotes_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryAggregatePrevotes - var metadata runtime.ServerMetadata - - msg, err := client.AggregatePrevotes(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_AggregatePrevotes_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryAggregatePrevotes - var metadata runtime.ServerMetadata - - msg, err := server.AggregatePrevotes(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_AggregateVote_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryAggregateVote - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["validator_addr"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_addr") - } - - protoReq.ValidatorAddr, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_addr", err) - } - - msg, err := client.AggregateVote(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_AggregateVote_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryAggregateVote - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["validator_addr"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_addr") - } - - protoReq.ValidatorAddr, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_addr", err) - } - - msg, err := server.AggregateVote(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_AggregateVotes_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryAggregateVotes - var metadata runtime.ServerMetadata - - msg, err := client.AggregateVotes(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_AggregateVotes_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryAggregateVotes - var metadata runtime.ServerMetadata - - msg, err := server.AggregateVotes(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryParams - var metadata runtime.ServerMetadata - - msg, err := client.Params(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryParams - var metadata runtime.ServerMetadata - - msg, err := server.Params(ctx, &protoReq) - return msg, metadata, err - -} - -// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". -// UnaryRPC :call QueryServer directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. -func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { - - mux.Handle("GET", pattern_Query_ExchangeRates_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_ExchangeRates_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_ExchangeRates_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_ActiveExchangeRates_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_ActiveExchangeRates_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_ActiveExchangeRates_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_PriceHistoryAtTime_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_PriceHistoryAtTime_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_PriceHistoryAtTime_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_AllPriceHistory_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_AllPriceHistory_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_AllPriceHistory_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_TwapTrackingLists_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_TwapTrackingLists_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_TwapTrackingLists_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_ArithmeticTwapPriceBetweenTime_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_ArithmeticTwapPriceBetweenTime_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_ArithmeticTwapPriceBetweenTime_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_FeederDelegation_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_FeederDelegation_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_FeederDelegation_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_MissCounter_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_MissCounter_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_MissCounter_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_SlashWindow_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_SlashWindow_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_SlashWindow_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_AggregatePrevote_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_AggregatePrevote_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_AggregatePrevote_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_AggregatePrevotes_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_AggregatePrevotes_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_AggregatePrevotes_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_AggregateVote_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_AggregateVote_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_AggregateVote_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_AggregateVotes_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_AggregateVotes_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_AggregateVotes_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -// RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but -// automatically dials to "endpoint" and closes the connection when "ctx" gets done. -func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.Dial(endpoint, opts...) - if err != nil { - return err - } - defer func() { - if err != nil { - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - return - } - go func() { - <-ctx.Done() - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - }() - }() - - return RegisterQueryHandler(ctx, mux, conn) -} - -// RegisterQueryHandler registers the http handlers for service Query to "mux". -// The handlers forward requests to the grpc endpoint over "conn". -func RegisterQueryHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { - return RegisterQueryHandlerClient(ctx, mux, NewQueryClient(conn)) -} - -// RegisterQueryHandlerClient registers the http handlers for service Query -// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "QueryClient". -// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "QueryClient" -// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in -// "QueryClient" to call the correct interceptors. -func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, client QueryClient) error { - - mux.Handle("GET", pattern_Query_ExchangeRates_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_ExchangeRates_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_ExchangeRates_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_ActiveExchangeRates_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_ActiveExchangeRates_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_ActiveExchangeRates_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_PriceHistoryAtTime_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_PriceHistoryAtTime_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_PriceHistoryAtTime_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_AllPriceHistory_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_AllPriceHistory_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_AllPriceHistory_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_TwapTrackingLists_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_TwapTrackingLists_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_TwapTrackingLists_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_ArithmeticTwapPriceBetweenTime_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_ArithmeticTwapPriceBetweenTime_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_ArithmeticTwapPriceBetweenTime_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_FeederDelegation_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_FeederDelegation_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_FeederDelegation_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_MissCounter_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_MissCounter_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_MissCounter_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_SlashWindow_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_SlashWindow_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_SlashWindow_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_AggregatePrevote_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_AggregatePrevote_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_AggregatePrevote_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_AggregatePrevotes_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_AggregatePrevotes_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_AggregatePrevotes_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_AggregateVote_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_AggregateVote_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_AggregateVote_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_AggregateVotes_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_AggregateVotes_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_AggregateVotes_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_Params_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -var ( - pattern_Query_ExchangeRates_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"juno", "oracle", "v1", "denoms", "exchange_rates", "denom"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_ActiveExchangeRates_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"juno", "oracle", "v1", "denoms", "active_exchange_rates"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_PriceHistoryAtTime_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"juno", "oracle", "v1", "price_history", "PriceHistoryAtTime"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_AllPriceHistory_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"juno", "oracle", "v1", "price_history", "denom"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_TwapTrackingLists_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"juno", "oracle", "v1", "price_history", "tracking_lists"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_ArithmeticTwapPriceBetweenTime_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"juno", "oracle", "v1", "price_history", "ArithmeticTwapPriceBetweenTime"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_FeederDelegation_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"juno", "oracle", "v1", "validators", "validator_addr", "feeder"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_MissCounter_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"juno", "oracle", "v1", "validators", "validator_addr", "miss"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_SlashWindow_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"juno", "oracle", "v1", "slash_window"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_AggregatePrevote_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"juno", "oracle", "v1", "validators", "validator_addr", "aggregate_prevote"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_AggregatePrevotes_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"juno", "oracle", "v1", "validators", "aggregate_prevotes"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_AggregateVote_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"juno", "oracle", "v1", "valdiators", "validator_addr", "aggregate_vote"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_AggregateVotes_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"juno", "oracle", "v1", "validators", "aggregate_votes"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_Params_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"juno", "oracle", "v1", "params"}, "", runtime.AssumeColonVerbOpt(false))) -) - -var ( - forward_Query_ExchangeRates_0 = runtime.ForwardResponseMessage - - forward_Query_ActiveExchangeRates_0 = runtime.ForwardResponseMessage - - forward_Query_PriceHistoryAtTime_0 = runtime.ForwardResponseMessage - - forward_Query_AllPriceHistory_0 = runtime.ForwardResponseMessage - - forward_Query_TwapTrackingLists_0 = runtime.ForwardResponseMessage - - forward_Query_ArithmeticTwapPriceBetweenTime_0 = runtime.ForwardResponseMessage - - forward_Query_FeederDelegation_0 = runtime.ForwardResponseMessage - - forward_Query_MissCounter_0 = runtime.ForwardResponseMessage - - forward_Query_SlashWindow_0 = runtime.ForwardResponseMessage - - forward_Query_AggregatePrevote_0 = runtime.ForwardResponseMessage - - forward_Query_AggregatePrevotes_0 = runtime.ForwardResponseMessage - - forward_Query_AggregateVote_0 = runtime.ForwardResponseMessage - - forward_Query_AggregateVotes_0 = runtime.ForwardResponseMessage - - forward_Query_Params_0 = runtime.ForwardResponseMessage -) diff --git a/x/oracle/types/test_fixtures.go b/x/oracle/types/test_fixtures.go deleted file mode 100644 index 836f56ae7..000000000 --- a/x/oracle/types/test_fixtures.go +++ /dev/null @@ -1,88 +0,0 @@ -package types - -func AddTrackingPriceHistoryProposalFixture( - mutators ...func(p *AddTrackingPriceHistoryProposal), -) *AddTrackingPriceHistoryProposal { - trackingList := DenomList{ - { - BaseDenom: JunoDenom, - SymbolDenom: JunoSymbol, - Exponent: JunoExponent, - }, - { - BaseDenom: AtomDenom, - SymbolDenom: AtomSymbol, - Exponent: AtomExponent, - }, - } - - p := &AddTrackingPriceHistoryProposal{ - Title: "Foo", - Description: "Bar", - TrackingList: trackingList, - } - - for _, m := range mutators { - m(p) - } - - return p -} - -func AddTrackingPriceHistoryWithWhitelistProposalFixture( - mutators ...func(p *AddTrackingPriceHistoryWithWhitelistProposal), -) *AddTrackingPriceHistoryWithWhitelistProposal { - trackingList := DenomList{ - { - BaseDenom: JunoDenom, - SymbolDenom: JunoSymbol, - Exponent: JunoExponent, - }, - { - BaseDenom: AtomDenom, - SymbolDenom: AtomSymbol, - Exponent: AtomExponent, - }, - } - - p := &AddTrackingPriceHistoryWithWhitelistProposal{ - Title: "Foo", - Description: "Bar", - TrackingList: trackingList, - } - - for _, m := range mutators { - m(p) - } - - return p -} - -func RemoveTrackingPriceHistoryProposalFixture( - mutators ...func(p *RemoveTrackingPriceHistoryProposal), -) *RemoveTrackingPriceHistoryProposal { - removeTwapList := DenomList{ - { - BaseDenom: JunoDenom, - SymbolDenom: JunoSymbol, - Exponent: JunoExponent, - }, - { - BaseDenom: AtomDenom, - SymbolDenom: AtomSymbol, - Exponent: AtomExponent, - }, - } - - p := &RemoveTrackingPriceHistoryProposal{ - Title: "Foo", - Description: "Bar", - RemoveTwapList: removeTwapList, - } - - for _, m := range mutators { - m(p) - } - - return p -} diff --git a/x/oracle/types/tx.pb.go b/x/oracle/types/tx.pb.go deleted file mode 100644 index 6d635d4f9..000000000 --- a/x/oracle/types/tx.pb.go +++ /dev/null @@ -1,1461 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: juno/oracle/v1/tx.proto - -package types - -import ( - context "context" - fmt "fmt" - _ "github.com/cosmos/gogoproto/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// MsgAggregateExchangeRatePrevote represents a message to submit an aggregate -// exchange rate prevote. -type MsgAggregateExchangeRatePrevote struct { - Hash string `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty" yaml:"hash"` - // Feeder is the author and the signer of the message. - Feeder string `protobuf:"bytes,2,opt,name=feeder,proto3" json:"feeder,omitempty" yaml:"feeder"` - Validator string `protobuf:"bytes,3,opt,name=validator,proto3" json:"validator,omitempty" yaml:"validator"` -} - -func (m *MsgAggregateExchangeRatePrevote) Reset() { *m = MsgAggregateExchangeRatePrevote{} } -func (m *MsgAggregateExchangeRatePrevote) String() string { return proto.CompactTextString(m) } -func (*MsgAggregateExchangeRatePrevote) ProtoMessage() {} -func (*MsgAggregateExchangeRatePrevote) Descriptor() ([]byte, []int) { - return fileDescriptor_2b40ba600a408005, []int{0} -} -func (m *MsgAggregateExchangeRatePrevote) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgAggregateExchangeRatePrevote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgAggregateExchangeRatePrevote.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgAggregateExchangeRatePrevote) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgAggregateExchangeRatePrevote.Merge(m, src) -} -func (m *MsgAggregateExchangeRatePrevote) XXX_Size() int { - return m.Size() -} -func (m *MsgAggregateExchangeRatePrevote) XXX_DiscardUnknown() { - xxx_messageInfo_MsgAggregateExchangeRatePrevote.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgAggregateExchangeRatePrevote proto.InternalMessageInfo - -// MsgAggregateExchangeRatePrevoteResponse defines the -// Msg/AggregateExchangeRatePrevote response type. -type MsgAggregateExchangeRatePrevoteResponse struct { -} - -func (m *MsgAggregateExchangeRatePrevoteResponse) Reset() { - *m = MsgAggregateExchangeRatePrevoteResponse{} -} -func (m *MsgAggregateExchangeRatePrevoteResponse) String() string { return proto.CompactTextString(m) } -func (*MsgAggregateExchangeRatePrevoteResponse) ProtoMessage() {} -func (*MsgAggregateExchangeRatePrevoteResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_2b40ba600a408005, []int{1} -} -func (m *MsgAggregateExchangeRatePrevoteResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgAggregateExchangeRatePrevoteResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgAggregateExchangeRatePrevoteResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgAggregateExchangeRatePrevoteResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgAggregateExchangeRatePrevoteResponse.Merge(m, src) -} -func (m *MsgAggregateExchangeRatePrevoteResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgAggregateExchangeRatePrevoteResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgAggregateExchangeRatePrevoteResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgAggregateExchangeRatePrevoteResponse proto.InternalMessageInfo - -// MsgAggregateExchangeRateVote represents a message to submit anaggregate -// exchange rate vote. -type MsgAggregateExchangeRateVote struct { - Salt string `protobuf:"bytes,1,opt,name=salt,proto3" json:"salt,omitempty" yaml:"salt"` - ExchangeRates string `protobuf:"bytes,2,opt,name=exchange_rates,json=exchangeRates,proto3" json:"exchange_rates,omitempty" yaml:"exchange_rates"` - // Feeder is the author and the signer of the message. - Feeder string `protobuf:"bytes,3,opt,name=feeder,proto3" json:"feeder,omitempty" yaml:"feeder"` - Validator string `protobuf:"bytes,4,opt,name=validator,proto3" json:"validator,omitempty" yaml:"validator"` -} - -func (m *MsgAggregateExchangeRateVote) Reset() { *m = MsgAggregateExchangeRateVote{} } -func (m *MsgAggregateExchangeRateVote) String() string { return proto.CompactTextString(m) } -func (*MsgAggregateExchangeRateVote) ProtoMessage() {} -func (*MsgAggregateExchangeRateVote) Descriptor() ([]byte, []int) { - return fileDescriptor_2b40ba600a408005, []int{2} -} -func (m *MsgAggregateExchangeRateVote) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgAggregateExchangeRateVote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgAggregateExchangeRateVote.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgAggregateExchangeRateVote) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgAggregateExchangeRateVote.Merge(m, src) -} -func (m *MsgAggregateExchangeRateVote) XXX_Size() int { - return m.Size() -} -func (m *MsgAggregateExchangeRateVote) XXX_DiscardUnknown() { - xxx_messageInfo_MsgAggregateExchangeRateVote.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgAggregateExchangeRateVote proto.InternalMessageInfo - -// MsgAggregateExchangeRateVoteResponse defines the -// Msg/AggregateExchangeRateVote response type. -type MsgAggregateExchangeRateVoteResponse struct { -} - -func (m *MsgAggregateExchangeRateVoteResponse) Reset() { *m = MsgAggregateExchangeRateVoteResponse{} } -func (m *MsgAggregateExchangeRateVoteResponse) String() string { return proto.CompactTextString(m) } -func (*MsgAggregateExchangeRateVoteResponse) ProtoMessage() {} -func (*MsgAggregateExchangeRateVoteResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_2b40ba600a408005, []int{3} -} -func (m *MsgAggregateExchangeRateVoteResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgAggregateExchangeRateVoteResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgAggregateExchangeRateVoteResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgAggregateExchangeRateVoteResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgAggregateExchangeRateVoteResponse.Merge(m, src) -} -func (m *MsgAggregateExchangeRateVoteResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgAggregateExchangeRateVoteResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgAggregateExchangeRateVoteResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgAggregateExchangeRateVoteResponse proto.InternalMessageInfo - -// MsgDelegateFeedConsent represents a message to delegate oracle voting rights -// to another address. -type MsgDelegateFeedConsent struct { - // Operator is the author and the signer of the message. - Operator string `protobuf:"bytes,1,opt,name=operator,proto3" json:"operator,omitempty" yaml:"operator"` - Delegate string `protobuf:"bytes,2,opt,name=delegate,proto3" json:"delegate,omitempty" yaml:"delegate"` -} - -func (m *MsgDelegateFeedConsent) Reset() { *m = MsgDelegateFeedConsent{} } -func (m *MsgDelegateFeedConsent) String() string { return proto.CompactTextString(m) } -func (*MsgDelegateFeedConsent) ProtoMessage() {} -func (*MsgDelegateFeedConsent) Descriptor() ([]byte, []int) { - return fileDescriptor_2b40ba600a408005, []int{4} -} -func (m *MsgDelegateFeedConsent) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgDelegateFeedConsent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgDelegateFeedConsent.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgDelegateFeedConsent) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgDelegateFeedConsent.Merge(m, src) -} -func (m *MsgDelegateFeedConsent) XXX_Size() int { - return m.Size() -} -func (m *MsgDelegateFeedConsent) XXX_DiscardUnknown() { - xxx_messageInfo_MsgDelegateFeedConsent.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgDelegateFeedConsent proto.InternalMessageInfo - -// MsgDelegateFeedConsentResponse defines the Msg/DelegateFeedConsent response -// type. -type MsgDelegateFeedConsentResponse struct { -} - -func (m *MsgDelegateFeedConsentResponse) Reset() { *m = MsgDelegateFeedConsentResponse{} } -func (m *MsgDelegateFeedConsentResponse) String() string { return proto.CompactTextString(m) } -func (*MsgDelegateFeedConsentResponse) ProtoMessage() {} -func (*MsgDelegateFeedConsentResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_2b40ba600a408005, []int{5} -} -func (m *MsgDelegateFeedConsentResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgDelegateFeedConsentResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgDelegateFeedConsentResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgDelegateFeedConsentResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgDelegateFeedConsentResponse.Merge(m, src) -} -func (m *MsgDelegateFeedConsentResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgDelegateFeedConsentResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgDelegateFeedConsentResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgDelegateFeedConsentResponse proto.InternalMessageInfo - -func init() { - proto.RegisterType((*MsgAggregateExchangeRatePrevote)(nil), "juno.oracle.v1.MsgAggregateExchangeRatePrevote") - proto.RegisterType((*MsgAggregateExchangeRatePrevoteResponse)(nil), "juno.oracle.v1.MsgAggregateExchangeRatePrevoteResponse") - proto.RegisterType((*MsgAggregateExchangeRateVote)(nil), "juno.oracle.v1.MsgAggregateExchangeRateVote") - proto.RegisterType((*MsgAggregateExchangeRateVoteResponse)(nil), "juno.oracle.v1.MsgAggregateExchangeRateVoteResponse") - proto.RegisterType((*MsgDelegateFeedConsent)(nil), "juno.oracle.v1.MsgDelegateFeedConsent") - proto.RegisterType((*MsgDelegateFeedConsentResponse)(nil), "juno.oracle.v1.MsgDelegateFeedConsentResponse") -} - -func init() { proto.RegisterFile("juno/oracle/v1/tx.proto", fileDescriptor_2b40ba600a408005) } - -var fileDescriptor_2b40ba600a408005 = []byte{ - // 502 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x94, 0x31, 0x6f, 0xd3, 0x40, - 0x14, 0xc7, 0x7d, 0xa4, 0xaa, 0xda, 0x43, 0x6d, 0xc1, 0x2d, 0x90, 0x46, 0x95, 0x5d, 0x1d, 0xa8, - 0x50, 0x09, 0xd9, 0x6a, 0x41, 0x42, 0xea, 0x04, 0x0d, 0x30, 0x11, 0x09, 0xdd, 0xc0, 0xc0, 0x82, - 0xae, 0xc9, 0xe3, 0x52, 0xe4, 0xf8, 0xa2, 0xbb, 0x6b, 0x94, 0x4e, 0x30, 0x30, 0x74, 0xe4, 0x23, - 0xf4, 0x1b, 0xf0, 0x35, 0x3a, 0x76, 0x64, 0xb2, 0x20, 0x59, 0x98, 0x18, 0xfc, 0x09, 0x90, 0xef, - 0x6c, 0x93, 0x8a, 0xb4, 0x8d, 0x37, 0xeb, 0xfe, 0xbf, 0x77, 0xef, 0xff, 0xfe, 0x7e, 0x3a, 0x7c, - 0xef, 0xd3, 0x51, 0x2c, 0x42, 0x21, 0x59, 0x3b, 0x82, 0x70, 0xb0, 0x13, 0xea, 0x61, 0xd0, 0x97, - 0x42, 0x0b, 0x77, 0x39, 0x13, 0x02, 0x2b, 0x04, 0x83, 0x9d, 0xc6, 0x1a, 0x17, 0x5c, 0x18, 0x29, - 0xcc, 0xbe, 0x2c, 0x45, 0xbe, 0x23, 0xec, 0xb7, 0x14, 0x7f, 0xc1, 0xb9, 0x04, 0xce, 0x34, 0xbc, - 0x1a, 0xb6, 0xbb, 0x2c, 0xe6, 0x40, 0x99, 0x86, 0xb7, 0x12, 0x06, 0x42, 0x83, 0x7b, 0x1f, 0xcf, - 0x75, 0x99, 0xea, 0xd6, 0xd1, 0x26, 0x7a, 0xb4, 0xb8, 0xbf, 0x92, 0x26, 0xfe, 0xcd, 0x63, 0xd6, - 0x8b, 0xf6, 0x48, 0x76, 0x4a, 0xa8, 0x11, 0xdd, 0x6d, 0x3c, 0xff, 0x11, 0xa0, 0x03, 0xb2, 0x7e, - 0xc3, 0x60, 0xb7, 0xd3, 0xc4, 0x5f, 0xb2, 0x98, 0x3d, 0x27, 0x34, 0x07, 0xdc, 0x5d, 0xbc, 0x38, - 0x60, 0xd1, 0x61, 0x87, 0x69, 0x21, 0xeb, 0x35, 0x43, 0xaf, 0xa5, 0x89, 0x7f, 0xcb, 0xd2, 0xa5, - 0x44, 0xe8, 0x3f, 0x6c, 0x6f, 0xe1, 0xe4, 0xd4, 0x77, 0x7e, 0x9f, 0xfa, 0x0e, 0xd9, 0xc6, 0x0f, - 0xaf, 0x31, 0x4c, 0x41, 0xf5, 0x45, 0xac, 0x80, 0xfc, 0x41, 0x78, 0xe3, 0x32, 0xf6, 0x5d, 0x3e, - 0x99, 0x62, 0x91, 0xfe, 0x7f, 0xb2, 0xec, 0x94, 0x50, 0x23, 0xba, 0xcf, 0xf1, 0x32, 0xe4, 0x85, - 0x1f, 0x24, 0xd3, 0xa0, 0xf2, 0x09, 0xd7, 0xd3, 0xc4, 0xbf, 0x63, 0xf1, 0x8b, 0x3a, 0xa1, 0x4b, - 0x30, 0xd1, 0x49, 0x4d, 0x64, 0x53, 0xab, 0x94, 0xcd, 0x5c, 0xd5, 0x6c, 0xb6, 0xf0, 0x83, 0xab, - 0xe6, 0x2d, 0x83, 0xf9, 0x8a, 0xf0, 0xdd, 0x96, 0xe2, 0x2f, 0x21, 0x32, 0xdc, 0x6b, 0x80, 0x4e, - 0x33, 0x13, 0x62, 0xed, 0x86, 0x78, 0x41, 0xf4, 0x41, 0x9a, 0xfe, 0x36, 0x96, 0xd5, 0x34, 0xf1, - 0x57, 0x6c, 0xff, 0x42, 0x21, 0xb4, 0x84, 0xb2, 0x82, 0x4e, 0x7e, 0x4f, 0x1e, 0xcc, 0x44, 0x41, - 0xa1, 0x10, 0x5a, 0x42, 0x13, 0x76, 0x37, 0xb1, 0x37, 0xdd, 0x45, 0x61, 0x74, 0xf7, 0x4b, 0x0d, - 0xd7, 0x5a, 0x8a, 0xbb, 0x27, 0x08, 0x6f, 0x5c, 0xb9, 0xa3, 0x61, 0x70, 0x71, 0xdd, 0x83, 0x6b, - 0x76, 0xa4, 0xf1, 0xac, 0x62, 0x41, 0x61, 0xc9, 0xfd, 0x8c, 0xd7, 0x2f, 0x5f, 0xa8, 0xc7, 0xb3, - 0xde, 0x9a, 0xd1, 0x8d, 0xa7, 0x55, 0xe8, 0xd2, 0x40, 0x0f, 0xaf, 0x4e, 0xfb, 0x71, 0x5b, 0x53, - 0x2e, 0x9b, 0xc2, 0x35, 0x82, 0xd9, 0xb8, 0xa2, 0xdd, 0xfe, 0x9b, 0xb3, 0x5f, 0x9e, 0x73, 0x36, - 0xf2, 0xd0, 0xf9, 0xc8, 0x43, 0x3f, 0x47, 0x1e, 0xfa, 0x36, 0xf6, 0x9c, 0xf3, 0xb1, 0xe7, 0xfc, - 0x18, 0x7b, 0xce, 0xfb, 0x80, 0x1f, 0xea, 0xee, 0xd1, 0x41, 0xd0, 0x16, 0xbd, 0xb0, 0x29, 0x54, - 0x4f, 0xa8, 0xa6, 0x88, 0xb5, 0x64, 0x6d, 0xad, 0x42, 0xf3, 0x32, 0x0d, 0x8b, 0xb7, 0x49, 0x1f, - 0xf7, 0x41, 0x1d, 0xcc, 0x9b, 0x67, 0xe7, 0xc9, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x30, 0xf3, - 0x33, 0xf5, 0xb7, 0x04, 0x00, 0x00, -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 - -// MsgClient is the client API for Msg service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type MsgClient interface { - // AggregateExchangeRatePrevote defines a method for submitting an aggregate - // exchange rate prevote. - AggregateExchangeRatePrevote(ctx context.Context, in *MsgAggregateExchangeRatePrevote, opts ...grpc.CallOption) (*MsgAggregateExchangeRatePrevoteResponse, error) - // AggregateExchangeRateVote defines a method for submitting an aggregate - // exchange rate vote. - AggregateExchangeRateVote(ctx context.Context, in *MsgAggregateExchangeRateVote, opts ...grpc.CallOption) (*MsgAggregateExchangeRateVoteResponse, error) - // DelegateFeedConsent defines a method for setting the feeder delegation. - DelegateFeedConsent(ctx context.Context, in *MsgDelegateFeedConsent, opts ...grpc.CallOption) (*MsgDelegateFeedConsentResponse, error) -} - -type msgClient struct { - cc grpc1.ClientConn -} - -func NewMsgClient(cc grpc1.ClientConn) MsgClient { - return &msgClient{cc} -} - -func (c *msgClient) AggregateExchangeRatePrevote(ctx context.Context, in *MsgAggregateExchangeRatePrevote, opts ...grpc.CallOption) (*MsgAggregateExchangeRatePrevoteResponse, error) { - out := new(MsgAggregateExchangeRatePrevoteResponse) - err := c.cc.Invoke(ctx, "/juno.oracle.v1.Msg/AggregateExchangeRatePrevote", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *msgClient) AggregateExchangeRateVote(ctx context.Context, in *MsgAggregateExchangeRateVote, opts ...grpc.CallOption) (*MsgAggregateExchangeRateVoteResponse, error) { - out := new(MsgAggregateExchangeRateVoteResponse) - err := c.cc.Invoke(ctx, "/juno.oracle.v1.Msg/AggregateExchangeRateVote", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *msgClient) DelegateFeedConsent(ctx context.Context, in *MsgDelegateFeedConsent, opts ...grpc.CallOption) (*MsgDelegateFeedConsentResponse, error) { - out := new(MsgDelegateFeedConsentResponse) - err := c.cc.Invoke(ctx, "/juno.oracle.v1.Msg/DelegateFeedConsent", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// MsgServer is the server API for Msg service. -type MsgServer interface { - // AggregateExchangeRatePrevote defines a method for submitting an aggregate - // exchange rate prevote. - AggregateExchangeRatePrevote(context.Context, *MsgAggregateExchangeRatePrevote) (*MsgAggregateExchangeRatePrevoteResponse, error) - // AggregateExchangeRateVote defines a method for submitting an aggregate - // exchange rate vote. - AggregateExchangeRateVote(context.Context, *MsgAggregateExchangeRateVote) (*MsgAggregateExchangeRateVoteResponse, error) - // DelegateFeedConsent defines a method for setting the feeder delegation. - DelegateFeedConsent(context.Context, *MsgDelegateFeedConsent) (*MsgDelegateFeedConsentResponse, error) -} - -// UnimplementedMsgServer can be embedded to have forward compatible implementations. -type UnimplementedMsgServer struct { -} - -func (*UnimplementedMsgServer) AggregateExchangeRatePrevote(ctx context.Context, req *MsgAggregateExchangeRatePrevote) (*MsgAggregateExchangeRatePrevoteResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method AggregateExchangeRatePrevote not implemented") -} -func (*UnimplementedMsgServer) AggregateExchangeRateVote(ctx context.Context, req *MsgAggregateExchangeRateVote) (*MsgAggregateExchangeRateVoteResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method AggregateExchangeRateVote not implemented") -} -func (*UnimplementedMsgServer) DelegateFeedConsent(ctx context.Context, req *MsgDelegateFeedConsent) (*MsgDelegateFeedConsentResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method DelegateFeedConsent not implemented") -} - -func RegisterMsgServer(s grpc1.Server, srv MsgServer) { - s.RegisterService(&_Msg_serviceDesc, srv) -} - -func _Msg_AggregateExchangeRatePrevote_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgAggregateExchangeRatePrevote) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).AggregateExchangeRatePrevote(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/juno.oracle.v1.Msg/AggregateExchangeRatePrevote", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).AggregateExchangeRatePrevote(ctx, req.(*MsgAggregateExchangeRatePrevote)) - } - return interceptor(ctx, in, info, handler) -} - -func _Msg_AggregateExchangeRateVote_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgAggregateExchangeRateVote) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).AggregateExchangeRateVote(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/juno.oracle.v1.Msg/AggregateExchangeRateVote", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).AggregateExchangeRateVote(ctx, req.(*MsgAggregateExchangeRateVote)) - } - return interceptor(ctx, in, info, handler) -} - -func _Msg_DelegateFeedConsent_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgDelegateFeedConsent) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).DelegateFeedConsent(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/juno.oracle.v1.Msg/DelegateFeedConsent", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).DelegateFeedConsent(ctx, req.(*MsgDelegateFeedConsent)) - } - return interceptor(ctx, in, info, handler) -} - -var _Msg_serviceDesc = grpc.ServiceDesc{ - ServiceName: "juno.oracle.v1.Msg", - HandlerType: (*MsgServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "AggregateExchangeRatePrevote", - Handler: _Msg_AggregateExchangeRatePrevote_Handler, - }, - { - MethodName: "AggregateExchangeRateVote", - Handler: _Msg_AggregateExchangeRateVote_Handler, - }, - { - MethodName: "DelegateFeedConsent", - Handler: _Msg_DelegateFeedConsent_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "juno/oracle/v1/tx.proto", -} - -func (m *MsgAggregateExchangeRatePrevote) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgAggregateExchangeRatePrevote) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgAggregateExchangeRatePrevote) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Validator) > 0 { - i -= len(m.Validator) - copy(dAtA[i:], m.Validator) - i = encodeVarintTx(dAtA, i, uint64(len(m.Validator))) - i-- - dAtA[i] = 0x1a - } - if len(m.Feeder) > 0 { - i -= len(m.Feeder) - copy(dAtA[i:], m.Feeder) - i = encodeVarintTx(dAtA, i, uint64(len(m.Feeder))) - i-- - dAtA[i] = 0x12 - } - if len(m.Hash) > 0 { - i -= len(m.Hash) - copy(dAtA[i:], m.Hash) - i = encodeVarintTx(dAtA, i, uint64(len(m.Hash))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgAggregateExchangeRatePrevoteResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgAggregateExchangeRatePrevoteResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgAggregateExchangeRatePrevoteResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *MsgAggregateExchangeRateVote) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgAggregateExchangeRateVote) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgAggregateExchangeRateVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Validator) > 0 { - i -= len(m.Validator) - copy(dAtA[i:], m.Validator) - i = encodeVarintTx(dAtA, i, uint64(len(m.Validator))) - i-- - dAtA[i] = 0x22 - } - if len(m.Feeder) > 0 { - i -= len(m.Feeder) - copy(dAtA[i:], m.Feeder) - i = encodeVarintTx(dAtA, i, uint64(len(m.Feeder))) - i-- - dAtA[i] = 0x1a - } - if len(m.ExchangeRates) > 0 { - i -= len(m.ExchangeRates) - copy(dAtA[i:], m.ExchangeRates) - i = encodeVarintTx(dAtA, i, uint64(len(m.ExchangeRates))) - i-- - dAtA[i] = 0x12 - } - if len(m.Salt) > 0 { - i -= len(m.Salt) - copy(dAtA[i:], m.Salt) - i = encodeVarintTx(dAtA, i, uint64(len(m.Salt))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgAggregateExchangeRateVoteResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgAggregateExchangeRateVoteResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgAggregateExchangeRateVoteResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *MsgDelegateFeedConsent) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgDelegateFeedConsent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgDelegateFeedConsent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Delegate) > 0 { - i -= len(m.Delegate) - copy(dAtA[i:], m.Delegate) - i = encodeVarintTx(dAtA, i, uint64(len(m.Delegate))) - i-- - dAtA[i] = 0x12 - } - if len(m.Operator) > 0 { - i -= len(m.Operator) - copy(dAtA[i:], m.Operator) - i = encodeVarintTx(dAtA, i, uint64(len(m.Operator))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgDelegateFeedConsentResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgDelegateFeedConsentResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgDelegateFeedConsentResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func encodeVarintTx(dAtA []byte, offset int, v uint64) int { - offset -= sovTx(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *MsgAggregateExchangeRatePrevote) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Hash) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = len(m.Feeder) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = len(m.Validator) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - return n -} - -func (m *MsgAggregateExchangeRatePrevoteResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *MsgAggregateExchangeRateVote) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Salt) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = len(m.ExchangeRates) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = len(m.Feeder) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = len(m.Validator) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - return n -} - -func (m *MsgAggregateExchangeRateVoteResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *MsgDelegateFeedConsent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Operator) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = len(m.Delegate) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - return n -} - -func (m *MsgDelegateFeedConsentResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func sovTx(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozTx(x uint64) (n int) { - return sovTx(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *MsgAggregateExchangeRatePrevote) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgAggregateExchangeRatePrevote: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgAggregateExchangeRatePrevote: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Hash", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Hash = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Feeder", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Feeder = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Validator = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgAggregateExchangeRatePrevoteResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgAggregateExchangeRatePrevoteResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgAggregateExchangeRatePrevoteResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgAggregateExchangeRateVote) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgAggregateExchangeRateVote: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgAggregateExchangeRateVote: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Salt", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Salt = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExchangeRates", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ExchangeRates = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Feeder", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Feeder = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Validator = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgAggregateExchangeRateVoteResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgAggregateExchangeRateVoteResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgAggregateExchangeRateVoteResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgDelegateFeedConsent) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgDelegateFeedConsent: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgDelegateFeedConsent: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Operator", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Operator = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Delegate", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Delegate = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgDelegateFeedConsentResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgDelegateFeedConsentResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgDelegateFeedConsentResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipTx(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowTx - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowTx - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowTx - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthTx - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupTx - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthTx - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthTx = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowTx = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupTx = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/oracle/types/utils_test.go b/x/oracle/types/utils_test.go deleted file mode 100644 index e6a744e6a..000000000 --- a/x/oracle/types/utils_test.go +++ /dev/null @@ -1,249 +0,0 @@ -package types - -import ( - "crypto/rand" - "math/big" - - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - sdk "github.com/cosmos/cosmos-sdk/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/tendermint/tendermint/crypto/secp256k1" - tmprotocrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" -) - -const ( - IbcDenomLuna = "ibc/0EF15DF2F02480ADE0BB6E85D9EBB5DAEA2836D3860E9F97F9AADE4F57A31AA0" - IbcDenomAtom = "ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2" -) - -var ( - _ StakingKeeper = MockStakingKeeper{} - _ stakingtypes.ValidatorI = MockValidator{} - - DenomJuno = Denom{ - BaseDenom: JunoDenom, - SymbolDenom: JunoSymbol, - Exponent: 6, - } - DenomLuna = Denom{ - BaseDenom: IbcDenomLuna, - SymbolDenom: "LUNA", - Exponent: 6, - } - DenomAtom = Denom{ - BaseDenom: IbcDenomAtom, - SymbolDenom: "ATOM", - Exponent: 6, - } -) - -// StringWithCharset generates a new string with the size of "length" param -// repeating every character of charset, if charset is empty uses "abcd" -func StringWithCharset(length int, charset string) string { - b := make([]byte, length) - - if len(charset) == 0 { - charset = "abcd" - } - - for i := 0; i < length; i++ { - for j := 0; j < len(charset); j++ { - b[i] = charset[j] - i++ - if len(b) == length { - return string(b) - } - } - } - - return string(b) -} - -// GenerateRandomValAddr returns N random validator addresses. -func GenerateRandomValAddr(quantity int) (validatorAddrs []sdk.ValAddress) { - for i := 0; i < quantity; i++ { - pubKey := secp256k1.GenPrivKey().PubKey() - valAddr := sdk.ValAddress(pubKey.Address()) - validatorAddrs = append(validatorAddrs, valAddr) - } - - return validatorAddrs -} - -// GenerateRandomTestCase -func GenerateRandomTestCase() (valValAddrs []sdk.ValAddress, stakingKeeper MockStakingKeeper) { - valValAddrs = []sdk.ValAddress{} - mockValidators := []MockValidator{} - - randNum, _ := rand.Int(rand.Reader, big.NewInt(10000)) - numInputs := 10 + int((randNum.Int64() % 100)) - for i := 0; i < numInputs; i++ { - pubKey := secp256k1.GenPrivKey().PubKey() - valValAddr := sdk.ValAddress(pubKey.Address()) - valValAddrs = append(valValAddrs, valValAddr) - - randomPower, _ := rand.Int(rand.Reader, big.NewInt(10000)) - power := randomPower.Int64()%1000 + 1 - mockValidator := NewMockValidator(valValAddr, power) - mockValidators = append(mockValidators, mockValidator) - } - - stakingKeeper = NewMockStakingKeeper(mockValidators) - - return -} - -// MockStakingKeeper imlements the StakingKeeper interface. -type MockStakingKeeper struct { - validators []MockValidator -} - -func NewMockStakingKeeper(validators []MockValidator) MockStakingKeeper { - return MockStakingKeeper{ - validators: validators, - } -} - -func (sk MockStakingKeeper) Validators() []MockValidator { - return sk.validators -} - -func (sk MockStakingKeeper) Validator(ctx sdk.Context, address sdk.ValAddress) stakingtypes.ValidatorI { - for _, validator := range sk.validators { - if validator.GetOperator().Equals(address) { - return validator - } - } - - return nil -} - -func (MockStakingKeeper) TotalBondedTokens(_ sdk.Context) sdk.Int { - return sdk.ZeroInt() -} - -func (sk MockStakingKeeper) GetBondedValidatorsByPower(ctx sdk.Context) []stakingtypes.Validator { - return nil -} - -func (MockStakingKeeper) ValidatorsPowerStoreIterator(ctx sdk.Context) sdk.Iterator { - return sdk.KVStoreReversePrefixIterator(nil, nil) -} - -func (sk MockStakingKeeper) GetLastValidatorPower(ctx sdk.Context, operator sdk.ValAddress) (power int64) { - return sk.Validator(ctx, operator).GetConsensusPower(sdk.DefaultPowerReduction) -} - -func (MockStakingKeeper) MaxValidators(sdk.Context) uint32 { - return 100 -} - -func (MockStakingKeeper) PowerReduction(ctx sdk.Context) (res sdk.Int) { - return sdk.DefaultPowerReduction -} - -func (MockStakingKeeper) Slash(sdk.Context, sdk.ConsAddress, int64, int64, sdk.Dec) { -} - -func (MockStakingKeeper) Jail(sdk.Context, sdk.ConsAddress) {} - -// MockValidator implements the ValidatorI interface. -type MockValidator struct { - power int64 - operator sdk.ValAddress -} - -func NewMockValidator(valAddr sdk.ValAddress, power int64) MockValidator { - return MockValidator{ - power: power, - operator: valAddr, - } -} - -func (MockValidator) IsJailed() bool { - return false -} - -func (MockValidator) GetMoniker() string { - return "" -} - -func (MockValidator) GetStatus() stakingtypes.BondStatus { - return stakingtypes.Bonded -} - -func (MockValidator) IsBonded() bool { - return true -} - -func (MockValidator) IsUnbonded() bool { - return false -} - -func (MockValidator) IsUnbonding() bool { - return false -} - -func (v MockValidator) GetOperator() sdk.ValAddress { - return v.operator -} - -func (MockValidator) ConsPubKey() (cryptotypes.PubKey, error) { - return nil, nil -} - -func (MockValidator) TmConsPublicKey() (tmprotocrypto.PublicKey, error) { - return tmprotocrypto.PublicKey{}, nil -} - -func (MockValidator) GetConsAddr() (sdk.ConsAddress, error) { - return nil, nil -} - -func (v MockValidator) GetTokens() sdk.Int { - return sdk.TokensFromConsensusPower(v.power, sdk.DefaultPowerReduction) -} - -func (v MockValidator) GetBondedTokens() sdk.Int { - return sdk.TokensFromConsensusPower(v.power, sdk.DefaultPowerReduction) -} - -func (v MockValidator) GetConsensusPower(powerReduction sdk.Int) int64 { - return v.power -} - -func (v *MockValidator) SetConsensusPower(power int64) { - v.power = power -} - -func (v MockValidator) GetCommission() sdk.Dec { - return sdk.ZeroDec() -} - -func (v MockValidator) GetMinSelfDelegation() sdk.Int { - return sdk.OneInt() -} - -func (v MockValidator) GetDelegatorShares() sdk.Dec { - return sdk.NewDec(v.power) -} - -func (v MockValidator) TokensFromShares(sdk.Dec) sdk.Dec { - return sdk.ZeroDec() -} - -func (v MockValidator) TokensFromSharesTruncated(sdk.Dec) sdk.Dec { - return sdk.ZeroDec() -} - -func (v MockValidator) TokensFromSharesRoundUp(sdk.Dec) sdk.Dec { - return sdk.ZeroDec() -} - -func (v MockValidator) SharesFromTokens(amt sdk.Int) (sdk.Dec, error) { - return sdk.ZeroDec(), nil -} - -func (v MockValidator) SharesFromTokensTruncated(amt sdk.Int) (sdk.Dec, error) { - return sdk.ZeroDec(), nil -} diff --git a/x/oracle/types/vote.go b/x/oracle/types/vote.go deleted file mode 100644 index 27a0f634c..000000000 --- a/x/oracle/types/vote.go +++ /dev/null @@ -1,107 +0,0 @@ -package types - -import ( - "fmt" - "strings" - - sdk "github.com/cosmos/cosmos-sdk/types" - "gopkg.in/yaml.v3" -) - -func NewAggregateExchangeRatePrevote( - hash AggregateVoteHash, - voter sdk.ValAddress, - submitBlock uint64, -) AggregateExchangeRatePrevote { - return AggregateExchangeRatePrevote{ - Hash: hash.String(), - Voter: voter.String(), - SubmitBlock: submitBlock, - } -} - -// String implement stringify -func (v AggregateExchangeRatePrevote) String() string { - out, _ := yaml.Marshal(v) - return string(out) -} - -func NewAggregateExchangeRateVote( - exchangeRateTuples ExchangeRateTuples, - voter sdk.ValAddress, -) AggregateExchangeRateVote { - return AggregateExchangeRateVote{ - ExchangeRateTuples: exchangeRateTuples, - Voter: voter.String(), - } -} - -// String implement stringify -func (v AggregateExchangeRateVote) String() string { - out, _ := yaml.Marshal(v) - return string(out) -} - -// NewExchangeRateTuple creates a ExchangeRateTuple instance -func NewExchangeRateTuple(denom string, exchangeRate sdk.Dec) ExchangeRateTuple { - return ExchangeRateTuple{ - denom, - exchangeRate, - } -} - -// String implement stringify -func (v ExchangeRateTuple) String() string { - out, _ := yaml.Marshal(v) - return string(out) -} - -// ExchangeRateTuples - array of ExchangeRateTuple -type ExchangeRateTuples []ExchangeRateTuple - -// String implements fmt.Stringer interface -func (tuples ExchangeRateTuples) String() string { - out, _ := yaml.Marshal(tuples) - return string(out) -} - -// ParseExchangeRateTuples ExchangeRateTuple parser -func ParseExchangeRateTuples(tuplesStr string) (ExchangeRateTuples, error) { - if len(tuplesStr) == 0 { - return nil, nil - } - - tupleStrs := strings.Split(tuplesStr, ",") - tuples := make(ExchangeRateTuples, len(tupleStrs)) - - duplicateCheckMap := make(map[string]bool) - for i, tupleStr := range tupleStrs { - denomAmountStr := strings.Split(tupleStr, ":") - if len(denomAmountStr) != 2 { - return nil, fmt.Errorf("invalid exchange rate %s", tupleStr) - } - - decCoin, err := sdk.NewDecFromStr(denomAmountStr[1]) - if err != nil { - return nil, err - } - if !decCoin.IsPositive() { - return nil, ErrInvalidOraclePrice - } - - denom := strings.ToUpper(denomAmountStr[0]) - - tuples[i] = ExchangeRateTuple{ - Denom: denom, - ExchangeRate: decCoin, - } - - if _, ok := duplicateCheckMap[denom]; ok { - return nil, fmt.Errorf("duplicated denom %s", denom) - } - - duplicateCheckMap[denom] = true - } - - return tuples, nil -} diff --git a/x/oracle/types/vote_test.go b/x/oracle/types/vote_test.go deleted file mode 100644 index 5ef7615e0..000000000 --- a/x/oracle/types/vote_test.go +++ /dev/null @@ -1,76 +0,0 @@ -package types - -import ( - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" -) - -func TestAggregateExchangeRatePrevoteString(t *testing.T) { - addr := sdk.ValAddress(sdk.AccAddress([]byte("addr1_______________"))) - aggregateVoteHash := GetAggregateVoteHash("salt", "JUNO:100,ATOM:100", addr) - aggregateExchangeRatePreVote := NewAggregateExchangeRatePrevote( - aggregateVoteHash, - addr, - 100, - ) - - require.Equal(t, "hash: ea66f346cd3ca1c35ff1a34a7a4557316fcb965c\nvoter: cosmosvaloper1v9jxgu33ta047h6lta047h6lta047h6lre9k4r\nsubmit_block: 100\n", aggregateExchangeRatePreVote.String()) -} - -func TestAggregateExchangeRateVoteString(t *testing.T) { - aggregateExchangeRatePreVote := NewAggregateExchangeRateVote( - ExchangeRateTuples{ - NewExchangeRateTuple(JunoDenom, sdk.OneDec()), - }, - sdk.ValAddress(sdk.AccAddress([]byte("addr1_______________"))), - ) - - require.Equal(t, "exchange_rate_tuples:\n - denom: ujuno\n exchange_rate: \"1.000000000000000000\"\nvoter: cosmosvaloper1v9jxgu33ta047h6lta047h6lta047h6lre9k4r\n", aggregateExchangeRatePreVote.String()) -} - -func TestExchangeRateTuplesString(t *testing.T) { - exchangeRateTuple := NewExchangeRateTuple(JunoDenom, sdk.OneDec()) - require.Equal(t, exchangeRateTuple.String(), "denom: ujuno\nexchange_rate: \"1.000000000000000000\"\n") - - exchangeRateTuples := ExchangeRateTuples{ - exchangeRateTuple, - NewExchangeRateTuple(IbcDenomAtom, sdk.SmallestDec()), - } - require.Equal(t, "- denom: ujuno\n exchange_rate: \"1.000000000000000000\"\n- denom: ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2\n exchange_rate: \"0.000000000000000001\"\n", exchangeRateTuples.String()) -} - -func TestParseExchangeRateTuples(t *testing.T) { - valid := "ujuno:123.0,uatom:123.123" - _, err := ParseExchangeRateTuples(valid) - require.NoError(t, err) - - duplicatedDenom := "ujuno:100.0,uatom:123.123,uatom:121233.123" - _, err = ParseExchangeRateTuples(duplicatedDenom) - require.Error(t, err) - - invalidCoins := "123.123" - _, err = ParseExchangeRateTuples(invalidCoins) - require.Error(t, err) - - invalidCoinsWithValid := "ujuno:123.0,123.1" - _, err = ParseExchangeRateTuples(invalidCoinsWithValid) - require.Error(t, err) - - zeroCoinsWithValid := "ujuno:0.0,uatom:123.1" - _, err = ParseExchangeRateTuples(zeroCoinsWithValid) - require.Error(t, err) - - negativeCoinsWithValid := "ujuno:-1234.5,uatom:123.1" - _, err = ParseExchangeRateTuples(negativeCoinsWithValid) - require.Error(t, err) - - multiplePricesPerRate := "ujuno:123: ujuno:456,uusdc:789" - _, err = ParseExchangeRateTuples(multiplePricesPerRate) - require.Error(t, err) - - res, err := ParseExchangeRateTuples("") - require.Nil(t, err) - require.Nil(t, res) -} diff --git a/x/oracle/util/checkers.go b/x/oracle/util/checkers.go deleted file mode 100644 index 1f4b64552..000000000 --- a/x/oracle/util/checkers.go +++ /dev/null @@ -1,14 +0,0 @@ -package util - -import sdk "github.com/cosmos/cosmos-sdk/types" - -// Signers converts signer bech32 addresses to sdk.AccAddress list. The function -// ignores errors. It is supposed to be used within Msg.GetSigners implementation. -func Signers(signers ...string) []sdk.AccAddress { - as := make([]sdk.AccAddress, len(signers)) - for i := range signers { - a, _ := sdk.AccAddressFromBech32(signers[i]) - as[i] = a - } - return as -} diff --git a/x/oracle/util/cli.go b/x/oracle/util/cli.go deleted file mode 100644 index 7b524b204..000000000 --- a/x/oracle/util/cli.go +++ /dev/null @@ -1,15 +0,0 @@ -package util - -import ( - "github.com/cosmos/cosmos-sdk/client" - "github.com/gogo/protobuf/proto" -) - -// PrintOrErr formats and print proto message to the standard output, unless the error -// is not nil. -func PrintOrErr(resp proto.Message, err error, cctx client.Context) error { - if err != nil { - return err - } - return cctx.PrintProto(resp) -} diff --git a/x/oracle/util/list.go b/x/oracle/util/list.go deleted file mode 100644 index 554c3a8eb..000000000 --- a/x/oracle/util/list.go +++ /dev/null @@ -1,11 +0,0 @@ -package util - -// Contains returns true if x is in ls -func Contains[T comparable](x T, ls []T) bool { - for i := range ls { - if ls[i] == x { - return true - } - } - return false -} diff --git a/x/oracle/util/store_helper.go b/x/oracle/util/store_helper.go deleted file mode 100644 index 38e1715a1..000000000 --- a/x/oracle/util/store_helper.go +++ /dev/null @@ -1,73 +0,0 @@ -package util - -import ( - "errors" - - "github.com/cosmos/cosmos-sdk/store" -) - -func GetFirstValueInRange[T any](storeObj store.KVStore, keyStart []byte, keyEnd []byte, reverseIterate bool, parseValue func([]byte) (T, error)) (T, error) { - // Get the last value if it exist because iterator not catch the end key - bz := storeObj.Get(keyEnd) - if bz != nil { - return parseValue(bz) - } - - iterator := makeIterator(storeObj, keyStart, keyEnd, reverseIterate) - defer iterator.Close() - - if !iterator.Valid() { - var blankValue T - return blankValue, errors.New("no values in range") - } - - return parseValue(iterator.Value()) -} - -func GetValueInRange[T any](storeObj store.KVStore, keyStart []byte, keyEnd []byte, reverseIterate bool, parseValue func([]byte) (T, error)) ([]T, error) { - var entryList []T - - iterator := makeIterator(storeObj, keyStart, keyEnd, reverseIterate) - defer iterator.Close() - - for ; iterator.Valid(); iterator.Next() { - entry, err := parseValue(iterator.Value()) - if err != nil { - return nil, err - } - entryList = append(entryList, entry) - } - - // Get the last value if it exist because iterator not catch the end key - bz := storeObj.Get(keyEnd) - if bz != nil { - entry, err := parseValue(bz) - if err != nil { - return nil, err - } - entryList = append(entryList, entry) - } - - // return err if not have any value in range - if len(entryList) == 0 { - return entryList, errors.New("no values in range") - } - - return entryList, nil -} - -func RemoveValueInRange(storeObj store.KVStore, keyStart []byte, keyEnd []byte, reverseIterate bool) { - iterator := makeIterator(storeObj, keyStart, keyEnd, reverseIterate) - defer iterator.Close() - - for ; iterator.Valid(); iterator.Next() { - storeObj.Delete(iterator.Key()) - } -} - -func makeIterator(storeObj store.KVStore, keyStart []byte, keyEnd []byte, reverse bool) store.Iterator { - if reverse { - return storeObj.ReverseIterator(keyStart, keyEnd) - } - return storeObj.Iterator(keyStart, keyEnd) -} diff --git a/x/oracle/wasm/interface.go b/x/oracle/wasm/interface.go deleted file mode 100644 index 3b2e94a37..000000000 --- a/x/oracle/wasm/interface.go +++ /dev/null @@ -1,40 +0,0 @@ -package wasm - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - - "github.com/CosmosContracts/juno/v13/x/oracle/keeper" -) - -// ExchangeRateQueryParams query request params for exchange rates -type ExchangeRateQueryParams struct { - Denom string `json:"denom"` -} - -// OracleQuery custom query interface for oracle querier -type OracleQuery struct { - ExchangeRate *ExchangeRateQueryParams `json:"exchange_rate,omitempty"` -} - -// ExchangeRateQueryResponse - exchange rates query response item -type ExchangeRateQueryResponse struct { - Rate string `json:"rate"` -} - -// QueryCustom implements custom query interface -func Handle(keeper keeper.Keeper, ctx sdk.Context, q *OracleQuery) (any, error) { - if q.ExchangeRate != nil { - rate, err := keeper.GetExchangeRate(ctx, q.ExchangeRate.Denom) - if err != nil { - return nil, err - } - - return ExchangeRateQueryResponse{ - Rate: rate.String(), - }, nil - } - - return nil, wasmvmtypes.UnsupportedRequest{Kind: "unknown Oracle variant"} -}