From cebca5cb0ef3c93159f32f50ef0d396c25936351 Mon Sep 17 00:00:00 2001 From: aljo242 Date: Mon, 10 Jun 2024 15:53:03 -0400 Subject: [PATCH 01/87] ok --- Makefile | 9 +- tests/feemarket/e2e_test.go | 138 +++ tests/feemarket/go.mod | 274 +++++ tests/feemarket/go.sum | 1875 +++++++++++++++++++++++++++++++++++ 4 files changed, 2294 insertions(+), 2 deletions(-) create mode 100644 tests/feemarket/e2e_test.go create mode 100644 tests/feemarket/go.mod create mode 100644 tests/feemarket/go.sum diff --git a/Makefile b/Makefile index c3994bde8..1e2805b22 100644 --- a/Makefile +++ b/Makefile @@ -121,7 +121,7 @@ build-static-linux-amd64: go.sum $(BUILDDIR)/ $(DOCKER) cp neutronbinary:/bin/neutrond $(BUILDDIR)/neutrond-linux-amd64 $(DOCKER) rm -f neutronbinary -build-slinky-e2e-docker-image: go.sum $(BUILDDIR)/ +build-e2e-docker-image: go.sum $(BUILDDIR)/ $(DOCKER) buildx create --name neutronbuilder || true $(DOCKER) buildx use neutronbuilder $(DOCKER) buildx build \ @@ -136,7 +136,12 @@ build-slinky-e2e-docker-image: go.sum $(BUILDDIR)/ -f Dockerfile.builder . slinky-e2e-test: - cd ./tests/slinky && go mod tidy && go test -v -race -timeout 20m -count=1 ./... + @echo "Running e2e slinky tests..." + cd ./tests/slinky && go mod tidy && go test -v -race -timeout 30m -count=1 ./... + +feemarket-e2e-test: + @echo "Running e2e feemarket tests..." + @cd ./tests/feemarket && go mod tidy && go test -p 1 -v -race -timeout 30m -count=1 ./... install-test-binary: check_version go.sum go install -mod=readonly $(BUILD_FLAGS_TEST_BINARY) ./cmd/neutrond diff --git a/tests/feemarket/e2e_test.go b/tests/feemarket/e2e_test.go new file mode 100644 index 000000000..c606a410f --- /dev/null +++ b/tests/feemarket/e2e_test.go @@ -0,0 +1,138 @@ +package feemarket_test + +import ( + "fmt" + "strconv" + "testing" + + "github.com/stretchr/testify/suite" + + sdkmath "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module/testutil" + "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/bank" + "github.com/cosmos/cosmos-sdk/x/gov" + "github.com/skip-mev/feemarket/tests/e2e" + feemarketmodule "github.com/skip-mev/feemarket/x/feemarket" + feemarkettypes "github.com/skip-mev/feemarket/x/feemarket/types" + marketmapmodule "github.com/skip-mev/slinky/x/marketmap" + "github.com/skip-mev/slinky/x/oracle" + interchaintest "github.com/strangelove-ventures/interchaintest/v8" + "github.com/strangelove-ventures/interchaintest/v8/chain/cosmos" + "github.com/strangelove-ventures/interchaintest/v8/ibc" +) + +func init() { + cfg := sdk.GetConfig() + cfg.SetBech32PrefixForAccount("neutron", "neutronpub") + cfg.Seal() +} + +var ( + minGasPrice = sdkmath.LegacyNewDec(10) + gasPrice = sdkmath.LegacyNewDec(1000000) + + image = ibc.DockerImage{ + Repository: "neutron-node", + Version: "latest", + UidGid: "1025:1025", + } + + oracleImage = ibc.DockerImage{ + Repository: "ghcr.io/skip-mev/slinky-sidecar", + Version: "latest", + UidGid: "1000:1000", + } + + numValidators = 4 + numFullNodes = 0 + noHostMount = false + gasAdjustment = 1.5 + + encodingConfig = testutil.MakeTestEncodingConfig( + bank.AppModuleBasic{}, + oracle.AppModuleBasic{}, + gov.AppModuleBasic{}, + auth.AppModuleBasic{}, + feemarketmodule.AppModuleBasic{}, + marketmapmodule.AppModuleBasic{}, + ) + + defaultGenesisKV = []cosmos.GenesisKV{ + { + Key: "consensus.params.abci.vote_extensions_enable_height", + Value: "2", + }, + { + Key: "consensus.params.block.max_gas", + Value: strconv.Itoa(int(feemarkettypes.DefaultMaxBlockUtilization)), + }, + { + Key: "app_state.feemarket.params", + Value: feemarkettypes.Params{ + Alpha: feemarkettypes.DefaultAlpha, + Beta: feemarkettypes.DefaultBeta, + Gamma: feemarkettypes.DefaultGamma, + Delta: feemarkettypes.DefaultDelta, + MinBaseGasPrice: minGasPrice, + MinLearningRate: feemarkettypes.DefaultMinLearningRate, + MaxLearningRate: feemarkettypes.DefaultMaxLearningRate, + MaxBlockUtilization: feemarkettypes.DefaultMaxBlockUtilization, + Window: feemarkettypes.DefaultWindow, + FeeDenom: "untrn", + Enabled: true, + DistributeFees: false, + }, + }, + { + Key: "app_state.feemarket.state", + Value: feemarkettypes.State{ + BaseGasPrice: gasPrice, + LearningRate: feemarkettypes.DefaultMaxLearningRate, + Window: make([]uint64, feemarkettypes.DefaultWindow), + Index: 0, + }, + }, + } + + denom = "untrn" + spec = &interchaintest.ChainSpec{ + ChainName: "feemarket", + Name: "feemarket", + NumValidators: &numValidators, + NumFullNodes: &numFullNodes, + Version: "latest", + NoHostMount: &noHostMount, + ChainConfig: ibc.ChainConfig{ + EncodingConfig: &encodingConfig, + Images: []ibc.DockerImage{ + image, + }, + Type: "cosmos", + Name: "feemarket", + Denom: denom, + ChainID: "chain-id-feemarket", + Bin: "neutrond", + Bech32Prefix: "neutron", + CoinType: "118", + GasAdjustment: gasAdjustment, + GasPrices: fmt.Sprintf("100000%s", denom), + TrustingPeriod: "48h", + NoHostMount: noHostMount, + ModifyGenesis: cosmos.ModifyGenesis(defaultGenesisKV), + SkipGenTx: true, + }, + } +) + +func TestE2ETestSuite(t *testing.T) { + s := e2e.NewIntegrationSuite( + spec, + oracleImage, + e2e.WithInterchainConstructor(e2e.CCVInterchainConstructor), + e2e.WithChainConstructor(e2e.CCVChainConstructor), + e2e.WithDenom(denom), + ) + suite.Run(t, s) +} diff --git a/tests/feemarket/go.mod b/tests/feemarket/go.mod new file mode 100644 index 000000000..18728e364 --- /dev/null +++ b/tests/feemarket/go.mod @@ -0,0 +1,274 @@ +module github.com/neutron-org/neutron/v4/tests/feemarket + +go 1.22.3 + +replace ( + cosmossdk.io/core => cosmossdk.io/core v0.11.0 + github.com/ChainSafe/go-schnorrkel => github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d + github.com/ChainSafe/go-schnorrkel/1 => github.com/ChainSafe/go-schnorrkel v1.0.0 + github.com/docker/distribution => github.com/docker/distribution v2.8.2+incompatible + github.com/docker/docker => github.com/docker/docker v24.0.9+incompatible + github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 + github.com/skip-mev/feemarket/tests/e2e => ../../../feemarket/tests/e2e + github.com/strangelove-ventures/interchaintest/v8 => ../../../interchaintest + github.com/vedhavyas/go-subkey => github.com/strangelove-ventures/go-subkey v1.0.7 +) + +require ( + cosmossdk.io/math v1.3.0 + github.com/cosmos/cosmos-sdk v0.50.7 + github.com/skip-mev/feemarket v1.0.0 + github.com/skip-mev/feemarket/tests/e2e v1.5.0 + github.com/skip-mev/slinky v1.0.0 + github.com/strangelove-ventures/interchaintest/v8 v8.4.0 + github.com/stretchr/testify v1.9.0 +) + +require ( + cloud.google.com/go v0.114.0 // indirect + cloud.google.com/go/auth v0.5.1 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.2 // indirect + cloud.google.com/go/compute/metadata v0.3.0 // indirect + cloud.google.com/go/iam v1.1.8 // indirect + cloud.google.com/go/storage v1.41.0 // indirect + cosmossdk.io/api v0.7.5 // indirect + cosmossdk.io/collections v0.4.0 // indirect + cosmossdk.io/core v0.11.0 // indirect + cosmossdk.io/depinject v1.0.0-alpha.4 // indirect + cosmossdk.io/errors v1.0.1 // indirect + cosmossdk.io/log v1.3.1 // indirect + cosmossdk.io/store v1.1.0 // indirect + cosmossdk.io/x/evidence v0.1.1 // indirect + cosmossdk.io/x/feegrant v0.1.1 // indirect + cosmossdk.io/x/tx v0.13.3 // indirect + cosmossdk.io/x/upgrade v0.1.3 // indirect + filippo.io/edwards25519 v1.1.0 // indirect + github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect + github.com/99designs/keyring v1.2.2 // indirect + github.com/BurntSushi/toml v1.4.0 // indirect + github.com/ChainSafe/go-schnorrkel v1.0.0 // indirect + github.com/ChainSafe/go-schnorrkel/1 v0.0.0-00010101000000-000000000000 // indirect + github.com/ComposableFi/go-subkey/v2 v2.0.0-tm03420 // indirect + github.com/DataDog/datadog-go v3.2.0+incompatible // indirect + github.com/DataDog/zstd v1.5.5 // indirect + github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect + github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/StirlingMarketingGroup/go-namecase v1.0.0 // indirect + github.com/avast/retry-go/v4 v4.5.1 // indirect + github.com/aws/aws-sdk-go v1.44.224 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect + github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect + github.com/bits-and-blooms/bitset v1.13.0 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cespare/xxhash v1.1.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/chzyer/readline v1.5.1 // indirect + github.com/cockroachdb/errors v1.11.1 // indirect + github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect + github.com/cockroachdb/pebble v1.1.0 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect + github.com/cometbft/cometbft v0.38.7 // indirect + github.com/cometbft/cometbft-db v0.11.0 // indirect + github.com/cosmos/btcutil v1.0.5 // indirect + github.com/cosmos/cosmos-db v1.0.2 // indirect + github.com/cosmos/cosmos-proto v1.0.0-beta.5 // indirect + github.com/cosmos/go-bip39 v1.0.0 // indirect + github.com/cosmos/gogogateway v1.2.0 // indirect + github.com/cosmos/gogoproto v1.5.0 // indirect + github.com/cosmos/iavl v1.1.2 // indirect + github.com/cosmos/ibc-go/modules/capability v1.0.0 // indirect + github.com/cosmos/ibc-go/v8 v8.2.1 // indirect + github.com/cosmos/ics23/go v0.10.0 // indirect + github.com/cosmos/interchain-security/v5 v5.0.0 // indirect + github.com/cosmos/ledger-cosmos-go v0.13.3 // indirect + github.com/danieljoos/wincred v1.2.0 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/deckarep/golang-set v1.8.0 // indirect + github.com/decred/base58 v1.0.4 // indirect + github.com/decred/dcrd/crypto/blake256 v1.0.1 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v2 v2.0.1 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect + github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect + github.com/dgraph-io/badger/v2 v2.2007.4 // indirect + github.com/dgraph-io/ristretto v0.1.1 // indirect + github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect + github.com/docker/distribution v2.8.2+incompatible // indirect + github.com/docker/docker v24.0.9+incompatible // indirect + github.com/docker/go-connections v0.5.0 // indirect + github.com/docker/go-units v0.5.0 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/dvsekhvalnov/jose2go v1.7.0 // indirect + github.com/emicklei/dot v1.6.2 // indirect + github.com/ethereum/go-ethereum v1.14.4 // indirect + github.com/fatih/color v1.17.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/getsentry/sentry-go v0.27.0 // indirect + github.com/go-kit/kit v0.13.0 // indirect + github.com/go-kit/log v0.2.1 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/gobwas/httphead v0.1.0 // indirect + github.com/gobwas/pool v0.2.1 // indirect + github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect + github.com/gogo/googleapis v1.4.1 // indirect + github.com/gogo/protobuf v1.3.3 // indirect + github.com/golang/glog v1.2.1 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/mock v1.6.0 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/btree v1.1.2 // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/google/orderedcode v0.0.1 // indirect + github.com/google/s2a-go v0.1.7 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect + github.com/googleapis/gax-go/v2 v2.12.4 // indirect + github.com/gorilla/handlers v1.5.2 // indirect + github.com/gorilla/mux v1.8.1 // indirect + github.com/gorilla/websocket v1.5.1 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.4.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/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-getter v1.7.4 // indirect + github.com/hashicorp/go-hclog v1.5.0 // indirect + github.com/hashicorp/go-immutable-radix v1.3.1 // indirect + github.com/hashicorp/go-metrics v0.5.3 // indirect + github.com/hashicorp/go-plugin v1.5.2 // indirect + github.com/hashicorp/go-safetemp v1.0.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/hashicorp/yamux v0.1.1 // indirect + github.com/hdevalence/ed25519consensus v0.1.0 // indirect + github.com/holiman/uint256 v1.2.4 // indirect + github.com/huandu/skiplist v1.2.0 // indirect + github.com/iancoleman/strcase v0.3.0 // indirect + github.com/icza/dyno v0.0.0-20220812133438-f0b6f8a18845 // indirect + github.com/improbable-eng/grpc-web v0.15.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/ipfs/go-cid v0.4.1 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/jmhodges/levigo v1.0.0 // indirect + github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/lib/pq v1.10.9 // indirect + github.com/libp2p/go-buffer-pool v0.1.0 // indirect + github.com/libp2p/go-libp2p v0.31.0 // indirect + github.com/linxGnu/grocksdb v1.8.14 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/manifoldco/promptui v0.9.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mimoo/StrobeGo v0.0.0-20220103164710-9a04d6ca976b // indirect + github.com/minio/highwayhash v1.0.2 // indirect + github.com/minio/sha256-simd v1.0.1 // indirect + github.com/misko9/go-substrate-rpc-client/v4 v4.0.0-20230913220906-b988ea7da0c2 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/go-testing-interface v1.14.1 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mr-tron/base58 v1.2.0 // indirect + github.com/mtibben/percent v0.2.1 // indirect + github.com/multiformats/go-base32 v0.1.0 // indirect + github.com/multiformats/go-base36 v0.2.0 // indirect + github.com/multiformats/go-multiaddr v0.11.0 // indirect + github.com/multiformats/go-multibase v0.2.0 // indirect + github.com/multiformats/go-multicodec v0.9.0 // indirect + github.com/multiformats/go-multihash v0.2.3 // indirect + github.com/multiformats/go-varint v0.0.7 // indirect + github.com/ncruces/go-strftime v0.1.9 // indirect + github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a // indirect + github.com/oklog/run v1.1.0 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.1.0-rc2 // indirect + github.com/opencontainers/runc v1.1.12 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67 // indirect + github.com/pierrec/xxHash v0.1.5 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/prometheus/client_golang v1.19.1 // indirect + github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/common v0.52.2 // indirect + github.com/prometheus/procfs v0.13.0 // indirect + github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/rs/cors v1.8.3 // indirect + github.com/rs/zerolog v1.32.0 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/sasha-s/go-deadlock v0.3.1 // indirect + github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spaolacci/murmur3 v1.1.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.6.0 // indirect + github.com/spf13/cobra v1.8.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/viper v1.19.0 // indirect + github.com/subosito/gotenv v1.6.0 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect + github.com/tendermint/go-amino v0.16.0 // indirect + github.com/tidwall/btree v1.7.0 // indirect + github.com/tyler-smith/go-bip32 v1.0.0 // indirect + github.com/tyler-smith/go-bip39 v1.1.0 // indirect + github.com/ulikunitz/xz v0.5.11 // indirect + github.com/zondax/hid v0.9.2 // indirect + github.com/zondax/ledger-go v0.14.3 // indirect + go.etcd.io/bbolt v1.3.8 // indirect + go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect + go.opentelemetry.io/otel v1.26.0 // indirect + go.opentelemetry.io/otel/metric v1.26.0 // indirect + go.opentelemetry.io/otel/trace v1.26.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + golang.org/x/crypto v0.24.0 // indirect + golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect + golang.org/x/mod v0.18.0 // indirect + golang.org/x/net v0.26.0 // indirect + golang.org/x/oauth2 v0.20.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.21.0 // indirect + golang.org/x/term v0.21.0 // indirect + golang.org/x/text v0.16.0 // indirect + golang.org/x/time v0.5.0 // indirect + golang.org/x/tools v0.22.0 // indirect + google.golang.org/api v0.180.0 // indirect + google.golang.org/genproto v0.0.0-20240401170217-c3f982113cda // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240610135401-a8a62080eff3 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 // indirect + google.golang.org/grpc v1.64.0 // indirect + google.golang.org/protobuf v1.34.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + gotest.tools/v3 v3.5.1 // indirect + lukechampine.com/blake3 v1.2.1 // indirect + modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 // indirect + modernc.org/libc v1.49.3 // indirect + modernc.org/mathutil v1.6.0 // indirect + modernc.org/memory v1.8.0 // indirect + modernc.org/sqlite v1.29.9 // indirect + modernc.org/strutil v1.2.0 // indirect + modernc.org/token v1.1.0 // indirect + nhooyr.io/websocket v1.8.7 // indirect + pgregory.net/rapid v1.1.0 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect +) diff --git a/tests/feemarket/go.sum b/tests/feemarket/go.sum new file mode 100644 index 000000000..205601cbc --- /dev/null +++ b/tests/feemarket/go.sum @@ -0,0 +1,1875 @@ +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.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.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.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.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= +cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= +cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go v0.114.0 h1:OIPFAdfrFDFO2ve2U7r/H5SwSbBzEdrBdE7xkgwc+kY= +cloud.google.com/go v0.114.0/go.mod h1:ZV9La5YYxctro1HTPug5lXH/GefROyW8PPD4T8n9J8E= +cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= +cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= +cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= +cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= +cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= +cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= +cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= +cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= +cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/auth v0.5.1 h1:0QNO7VThG54LUzKiQxv8C6x1YX7lUrzlAa1nVLF8CIw= +cloud.google.com/go/auth v0.5.1/go.mod h1:vbZT8GjzDf3AVqCcQmqeeM32U9HBFc32vVVAbwDsa6s= +cloud.google.com/go/auth/oauth2adapt v0.2.2 h1:+TTV8aXpjeChS9M+aTtN/TjdQnzJvmzKFt//oWu7HX4= +cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q= +cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= +cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= +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/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= +cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= +cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= +cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= +cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= +cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= +cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= +cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= +cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= +cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= +cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= +cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= +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/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= +cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= +cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= +cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= +cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= +cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= +cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= +cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= +cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= +cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= +cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= +cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= +cloud.google.com/go/iam v1.1.8 h1:r7umDwhj+BQyz0ScZMp4QrGXjSTI3ZINnpgU2nlB/K0= +cloud.google.com/go/iam v1.1.8/go.mod h1:GvE6lyMmfxXauzNq8NbgJbeVQNspG+tcdL/W8QO1+zE= +cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= +cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= +cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= +cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= +cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= +cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= +cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= +cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= +cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= +cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= +cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= +cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= +cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +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/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= +cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= +cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= +cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= +cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= +cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= +cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= +cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= +cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= +cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= +cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= +cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= +cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= +cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= +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.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= +cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storage v1.41.0 h1:RusiwatSu6lHeEXe3kglxakAmAbfV+rhtPqA6i8RBx0= +cloud.google.com/go/storage v1.41.0/go.mod h1:J1WCa/Z2FcgdEDuPUY8DxT5I+d9mFKsCepp5vR6Sq80= +cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= +cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= +cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= +cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= +cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= +cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= +cosmossdk.io/api v0.7.5 h1:eMPTReoNmGUm8DeiQL9DyM8sYDjEhWzL1+nLbI9DqtQ= +cosmossdk.io/api v0.7.5/go.mod h1:IcxpYS5fMemZGqyYtErK7OqvdM0C8kdW3dq8Q/XIG38= +cosmossdk.io/client/v2 v2.0.0-beta.1 h1:XkHh1lhrLYIT9zKl7cIOXUXg2hdhtjTPBUfqERNA1/Q= +cosmossdk.io/client/v2 v2.0.0-beta.1/go.mod h1:JEUSu9moNZQ4kU3ir1DKD5eU4bllmAexrGWjmb9k8qU= +cosmossdk.io/collections v0.4.0 h1:PFmwj2W8szgpD5nOd8GWH6AbYNi1f2J6akWXJ7P5t9s= +cosmossdk.io/collections v0.4.0/go.mod h1:oa5lUING2dP+gdDquow+QjlF45eL1t4TJDypgGd+tv0= +cosmossdk.io/core v0.11.0 h1:vtIafqUi+1ZNAE/oxLOQQ7Oek2n4S48SWLG8h/+wdbo= +cosmossdk.io/core v0.11.0/go.mod h1:LaTtayWBSoacF5xNzoF8tmLhehqlA9z1SWiPuNC6X1w= +cosmossdk.io/depinject v1.0.0-alpha.4 h1:PLNp8ZYAMPTUKyG9IK2hsbciDWqna2z1Wsl98okJopc= +cosmossdk.io/depinject v1.0.0-alpha.4/go.mod h1:HeDk7IkR5ckZ3lMGs/o91AVUc7E596vMaOmslGFM3yU= +cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= +cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= +cosmossdk.io/log v1.3.1 h1:UZx8nWIkfbbNEWusZqzAx3ZGvu54TZacWib3EzUYmGI= +cosmossdk.io/log v1.3.1/go.mod h1:2/dIomt8mKdk6vl3OWJcPk2be3pGOS8OQaLUM/3/tCM= +cosmossdk.io/math v1.3.0 h1:RC+jryuKeytIiictDslBP9i1fhkVm6ZDmZEoNP316zE= +cosmossdk.io/math v1.3.0/go.mod h1:vnRTxewy+M7BtXBNFybkuhSH4WfedVAAnERHgVFhp3k= +cosmossdk.io/store v1.1.0 h1:LnKwgYMc9BInn9PhpTFEQVbL9UK475G2H911CGGnWHk= +cosmossdk.io/store v1.1.0/go.mod h1:oZfW/4Fc/zYqu3JmQcQdUJ3fqu5vnYTn3LZFFy8P8ng= +cosmossdk.io/x/circuit v0.1.1 h1:KPJCnLChWrxD4jLwUiuQaf5mFD/1m7Omyo7oooefBVQ= +cosmossdk.io/x/circuit v0.1.1/go.mod h1:B6f/urRuQH8gjt4eLIXfZJucrbreuYrKh5CSjaOxr+Q= +cosmossdk.io/x/evidence v0.1.1 h1:Ks+BLTa3uftFpElLTDp9L76t2b58htjVbSZ86aoK/E4= +cosmossdk.io/x/evidence v0.1.1/go.mod h1:OoDsWlbtuyqS70LY51aX8FBTvguQqvFrt78qL7UzeNc= +cosmossdk.io/x/feegrant v0.1.1 h1:EKFWOeo/pup0yF0svDisWWKAA9Zags6Zd0P3nRvVvw8= +cosmossdk.io/x/feegrant v0.1.1/go.mod h1:2GjVVxX6G2fta8LWj7pC/ytHjryA6MHAJroBWHFNiEQ= +cosmossdk.io/x/tx v0.13.3 h1:Ha4mNaHmxBc6RMun9aKuqul8yHiL78EKJQ8g23Zf73g= +cosmossdk.io/x/tx v0.13.3/go.mod h1:I8xaHv0rhUdIvIdptKIqzYy27+n2+zBVaxO6fscFhys= +cosmossdk.io/x/upgrade v0.1.3 h1:q4XpXc6zp0dX6x74uBtfN6+J7ikaQev5Bla6Q0ADLK8= +cosmossdk.io/x/upgrade v0.1.3/go.mod h1:jOdQhnaY5B8CDUoUbed23/Lre0Dk+r6BMQE40iKlVVQ= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +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.2 h1:pZd3neh/EmUzWONb35LxQfvuY7kiSXAq3HQd97+XBn0= +github.com/99designs/keyring v1.2.2/go.mod h1:wes/FrByc8j7lFOAGLGSNEg8f/PaI3cgTBqhFkHUrPk= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +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/ChainSafe/go-schnorrkel v1.0.0 h1:3aDA67lAykLaG1y3AOjs88dMxC88PgUuHRrLeDnvGIM= +github.com/ChainSafe/go-schnorrkel v1.0.0/go.mod h1:dpzHYVxLZcp8pjlV+O+UR8K0Hp/z7vcchBSbMBEhCw4= +github.com/ComposableFi/go-subkey/v2 v2.0.0-tm03420 h1:oknQF/iIhf5lVjbwjsVDzDByupRhga8nhA3NAmwyHDA= +github.com/ComposableFi/go-subkey/v2 v2.0.0-tm03420/go.mod h1:KYkiMX5AbOlXXYfxkrYPrRPV6EbVUALTQh5ptUOJzu8= +github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= +github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e h1:ahyvB3q25YnZWly5Gq1ekg6jcmWaGj/vG/MhF4aisoc= +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUqhHd//musdITWjFvNTHn90WG9bMLBEPQZ17Cmlpw= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec h1:1Qb69mGp/UtRPn422BH4/Y4Q3SLUrD9KHuDkm8iodFc= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec/go.mod h1:CD8UlnlLDiqb36L110uqiP2iSflVjx9g/3U9hCI4q2U= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= +github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +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 v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= +github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= +github.com/StirlingMarketingGroup/go-namecase v1.0.0 h1:2CzaNtCzc4iNHirR+5ru9OzGg8rQp860gqLBFqRI02Y= +github.com/StirlingMarketingGroup/go-namecase v1.0.0/go.mod h1:ZsoSKcafcAzuBx+sndbxHu/RjDcDTrEdT4UvhniHfio= +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/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= +github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +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/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +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-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/avast/retry-go/v4 v4.5.1 h1:AxIx0HGi4VZ3I02jr78j5lZ3M6x1E0Ivxa6b0pUUh7o= +github.com/avast/retry-go/v4 v4.5.1/go.mod h1:/sipNsvNB3RRuT5iNcb6h73nw3IBmXJ/H3XrCQYSOpc= +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 v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go v1.44.224 h1:09CiaaF35nRmxrzWZ2uRq5v6Ghg/d2RiPjZnSgtt+RQ= +github.com/aws/aws-sdk-go v1.44.224/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/benbjohnson/clock v1.1.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/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= +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/bits-and-blooms/bitset v1.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJRUA0wFAVE= +github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +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.3 h1:xfbtw8lwpp0G6NwSHb+UE67ryTFHJAiNuipusjXSohQ= +github.com/btcsuite/btcd/btcutil v1.1.3/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= +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/btcutil v1.0.3-0.20201208143702-a53e38424cce h1:YtWJF7RHm2pYCvA5t0RPmAaLUhREsKuKd+SLhxFbFeQ= +github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= +github.com/bufbuild/protocompile v0.6.0 h1:Uu7WiSQ6Yj9DbkdnOe7U4mNKp58y9WDMKDn28/ZlunY= +github.com/bufbuild/protocompile v0.6.0/go.mod h1:YNP35qEYoYGme7QMtz5SBCoN4kL4g12jTtjuzRNdjpE= +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.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +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.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= +github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= +github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= +github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= +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/cmars/basen v0.0.0-20150613233007-fe3947df716e h1:0XBUw73chJ1VYSsfvcPvVT7auykAJce9FpRr10L6Qhw= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:P13beTBKr5Q18lJe1rIoLUqjM+CB1zYrRg44ZqGuQSA= +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/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= +github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= +github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/pebble v1.1.0 h1:pcFh8CdCIt2kmEpK0OIatq67Ln9uGDYY3d5XnE0LJG4= +github.com/cockroachdb/pebble v1.1.0/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/cometbft/cometbft v0.38.7 h1:ULhIOJ9+LgSy6nLekhq9ae3juX3NnQUMMPyVdhZV6Hk= +github.com/cometbft/cometbft v0.38.7/go.mod h1:HIyf811dFMI73IE0F7RrnY/Fr+d1+HuJAgtkEpQjCMY= +github.com/cometbft/cometbft-db v0.11.0 h1:M3Lscmpogx5NTbb1EGyGDaFRdsoLWrUWimFEyf7jej8= +github.com/cometbft/cometbft-db v0.11.0/go.mod h1:GDPJAC/iFHNjmZZPN8V8C1yr/eyityhi2W1hz2MGKSc= +github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= +github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= +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.5.0/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-db v1.0.2 h1:hwMjozuY1OlJs/uh6vddqnk9j7VamLv+0DBlbEXbAKs= +github.com/cosmos/cosmos-db v1.0.2/go.mod h1:Z8IXcFJ9PqKK6BIsVOB3QXtkKoqUOp1vRvPT39kOXEA= +github.com/cosmos/cosmos-proto v1.0.0-beta.5 h1:eNcayDLpip+zVLRLYafhzLvQlSmyab+RC5W7ZfmxJLA= +github.com/cosmos/cosmos-proto v1.0.0-beta.5/go.mod h1:hQGLpiIUloJBMdQMMWb/4wRApmI9hjHH05nefC0Ojec= +github.com/cosmos/cosmos-sdk v0.50.7 h1:LsBGKxifENR/DN4E1RZaitsyL93HU44x0p8EnMHp4V4= +github.com/cosmos/cosmos-sdk v0.50.7/go.mod h1:84xDDJEHttRT7NDGwBaUOLVOMN0JNE9x7NbsYIxXs1s= +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/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= +github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= +github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= +github.com/cosmos/gogoproto v1.5.0 h1:SDVwzEqZDDBoslaeZg+dGE55hdzHfgUA40pEanMh52o= +github.com/cosmos/gogoproto v1.5.0/go.mod h1:iUM31aofn3ymidYG6bUR5ZFrk+Om8p5s754eMUcyp8I= +github.com/cosmos/iavl v1.1.2 h1:zL9FK7C4L/P4IF1Dm5fIwz0WXCnn7Bp1M2FxH0ayM7Y= +github.com/cosmos/iavl v1.1.2/go.mod h1:jLeUvm6bGT1YutCaL2fIar/8vGUE8cPZvh/gXEWDaDM= +github.com/cosmos/ibc-go/modules/capability v1.0.0 h1:r/l++byFtn7jHYa09zlAdSeevo8ci1mVZNO9+V0xsLE= +github.com/cosmos/ibc-go/modules/capability v1.0.0/go.mod h1:D81ZxzjZAe0ZO5ambnvn1qedsFQ8lOwtqicG6liLBco= +github.com/cosmos/ibc-go/v8 v8.2.1 h1:MTsnZZjxvGD4Fv5pYyx5UkELafSX0rlPt6IfsE2BpTQ= +github.com/cosmos/ibc-go/v8 v8.2.1/go.mod h1:wj3qx75iC/XNnsMqbPDCIGs0G6Y3E/lo3bdqCyoCy+8= +github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= +github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= +github.com/cosmos/interchain-security/v5 v5.0.0 h1:iwHu1nFbXuYfa13isEgm6hkHU+2t/t56YjcfyP3PnQA= +github.com/cosmos/interchain-security/v5 v5.0.0/go.mod h1:h/RkwOppo5AJj+1pkQyfjqU1MPdpohD/S6oEeAXpGZY= +github.com/cosmos/ledger-cosmos-go v0.13.3 h1:7ehuBGuyIytsXbd4MP43mLeoN2LTOEnk5nvue4rK+yM= +github.com/cosmos/ledger-cosmos-go v0.13.3/go.mod h1:HENcEP+VtahZFw38HZ3+LS3Iv5XV6svsnkk9vdJtLr8= +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.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +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/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= +github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= +github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/decred/base58 v1.0.4 h1:QJC6B0E0rXOPA8U/kw2rP+qiRJsUaE2Er+pYb3siUeA= +github.com/decred/base58 v1.0.4/go.mod h1:jJswKPEdvpFpvf7dsDvFZyLT22xZ9lWqEByX38oGd9E= +github.com/decred/dcrd/chaincfg/chainhash v1.0.2 h1:rt5Vlq/jM3ZawwiacWjPa+smINyLRN07EO0cNBV6DGU= +github.com/decred/dcrd/chaincfg/chainhash v1.0.2/go.mod h1:BpbrGgrPTr3YJYRN3Bm+D9NuaFd+zGyNeIKgrhCXK60= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/dcrec/secp256k1/v2 v2.0.1 h1:18HurQ6DfHeNvwIjvOmrgr44bPdtVaQAe/WWwHg9goM= +github.com/decred/dcrd/dcrec/secp256k1/v2 v2.0.1/go.mod h1:XmyzkaXBy7ZvHdrTAlXAjpog8qKSAWa3ze7yqzWmgmc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +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 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= +github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= +github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= +github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +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/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= +github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v24.0.9+incompatible h1:HPGzNmwfLZWdxHqK9/II92pyi1EpYKsAqcl4G0Of9v0= +github.com/docker/docker v24.0.9+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +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 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/dvsekhvalnov/jose2go v1.7.0 h1:bnQc8+GMnidJZA8zc6lLEAb4xNrIqHwO+9TzqvtQZPo= +github.com/dvsekhvalnov/jose2go v1.7.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/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/emicklei/dot v1.6.2 h1:08GN+DD79cy/tzN6uLCT84+2Wk9u+wvqP+Hkx/dIR8A= +github.com/emicklei/dot v1.6.2/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.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/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/ethereum/go-ethereum v1.14.4 h1:AI1778nnI9vb3eCcLo6XTw/lqp6ilVHQmbWmJOUHGU8= +github.com/ethereum/go-ethereum v1.14.4/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= +github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +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.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +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.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= +github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/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.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= +github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +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.13.0 h1:OoneCcHKHQ03LfBpoQCUfCluwd2Vt3ohz+kvbJneZAU= +github.com/go-kit/kit v0.13.0/go.mod h1:phqEHMMUbyrCFCTgH48JueqrM3md2HcAZ8N3XE4FKDg= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.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.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +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.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= +github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= +github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= +github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/gobwas/ws v1.2.1 h1:F2aeBZrm2NDsc7vbovKrWSogd4wvfAxg0FQ89/iqOTk= +github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +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/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4= +github.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-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.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +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.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +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/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +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/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.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/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.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 h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= +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/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= +github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= +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-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd h1:gbpYu9NMq8jhDVbvlGkMFWCjLFlqqEZjEmObmhUy6Vo= +github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= +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/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go/v2 v2.12.4 h1:9gWcmF85Wvq4ryPFvGFaOgPIs1AQX0d0bcbGw4Z96qg= +github.com/googleapis/gax-go/v2 v2.12.4/go.mod h1:KYEYLorsnIGDi/rPC8b5TdlB9kbKoFubselGIoBMCwI= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= +github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= +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.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +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.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= +github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= +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.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +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/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-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-getter v1.7.4 h1:3yQjWuxICvSpYwqSayAdKRFcvBl1y/vogCxczWSmix0= +github.com/hashicorp/go-getter v1.7.4/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= +github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= +github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +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-metrics v0.5.3 h1:M5uADWMOGCTUNU1YuC4hfknOeHNaX54LDm4oYSucoNE= +github.com/hashicorp/go-metrics v0.5.3/go.mod h1:KEjodfebIOuBYSAe/bHTm+HChmKSxAOXPBieMLYozDE= +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-plugin v1.5.2 h1:aWv8eimFqWlsEiMrYZdPYl+FdHaBJSN4AWwGWfT1G2Y= +github.com/hashicorp/go-plugin v1.5.2/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= +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-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= +github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= +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.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.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 v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +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/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= +github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= +github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= +github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= +github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= +github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= +github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +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/icza/dyno v0.0.0-20220812133438-f0b6f8a18845 h1:H+uM0Bv88eur3ZSsd2NGKg3YIiuXxwxtlN7HjE66UTU= +github.com/icza/dyno v0.0.0-20220812133438-f0b6f8a18845/go.mod h1:c1tRKs5Tx7E2+uHGSyyncziFjvGpgv4H2HrqXeUQ/Uk= +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.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= +github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= +github.com/jhump/protoreflect v1.15.3 h1:6SFRuqU45u9hIZPJAoZ8c28T3nK64BNdp9w6jFonzls= +github.com/jhump/protoreflect v1.15.3/go.mod h1:4ORHmSBmlCW8fh3xHmJMGyul1zNqZK4Elxc8qKP+p1k= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +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/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/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.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/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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +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/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= +github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= +github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +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/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.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +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/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/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/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/libp2p/go-libp2p v0.31.0 h1:LFShhP8F6xthWiBBq3euxbKjZsoRajVEyBS9snfHxYg= +github.com/libp2p/go-libp2p v0.31.0/go.mod h1:W/FEK1c/t04PbRH3fA9i5oucu5YcgrG0JVoBWT1B7Eg= +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/linxGnu/grocksdb v1.8.14 h1:HTgyYalNwBSG/1qCQUIott44wU5b2Y9Kr3z7SK5OfGQ= +github.com/linxGnu/grocksdb v1.8.14/go.mod h1:QYiYypR2d4v63Wj1adOOfzglnoII0gLj3PNh4fZkcFA= +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/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= +github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +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.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/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +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-20220103164710-9a04d6ca976b h1:QrHweqAtyJ9EwCaGHBu1fghwxIPiopAHV06JlXrMHjk= +github.com/mimoo/StrobeGo v0.0.0-20220103164710-9a04d6ca976b/go.mod h1:xxLb2ip6sSUts3g1irPVHyk/DGslwQsNOo9I7smJfNU= +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/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= +github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= +github.com/misko9/go-substrate-rpc-client/v4 v4.0.0-20230913220906-b988ea7da0c2 h1:G/cVeTAbB9S/6FSWWqpFV0v49hiuHLbJPu9hTZ0UR2A= +github.com/misko9/go-substrate-rpc-client/v4 v4.0.0-20230913220906-b988ea7da0c2/go.mod h1:Q5BxOd9FxJqYp4vCiLGVdetecPcWTmUQIu0bRigYosU= +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/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +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.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/moby/term v0.0.0-20221205130635-1aeaba878587 h1:HfkjXDfhgVaN5rmueG8cL8KKeFNecRCXFhaJ2qZ5SKA= +github.com/moby/term v0.0.0-20221205130635-1aeaba878587/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +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/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= +github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +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/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= +github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= +github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= +github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= +github.com/multiformats/go-multiaddr v0.11.0 h1:XqGyJ8ufbCE0HmTDwx2kPdsrQ36AGPZNZX6s6xfJH10= +github.com/multiformats/go-multiaddr v0.11.0/go.mod h1:gWUm0QLR4thQ6+ZF6SXUw8YjtwQSPapICM+NmCkxHSM= +github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= +github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= +github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg= +github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= +github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= +github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= +github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= +github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= +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/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/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= +github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +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/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a h1:dlRvE5fWabOchtH7znfiFCcOvmIYgOeAS5ifBXBlh9Q= +github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a/go.mod h1:hVoHR2EVESiICEMbg137etN/Lx+lSrHPTD39Z/uE+2s= +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/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= +github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +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.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +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.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +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/image-spec v1.1.0-rc2/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= +github.com/opencontainers/runc v1.1.12 h1:BOIssBaW1La0/qbNZHXOOa71dZfZEQOzW7dqQf3phss= +github.com/opencontainers/runc v1.1.12/go.mod h1:S+lQwSfncpBha7XTy/5lBwWgm5+y5Ma/O44Ekby9FK8= +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.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/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= +github.com/oxyno-zeta/gomock-extra-matcher v1.2.0 h1:WPEclU0y0PMwUzdDcaKZvld4aXpa3fkzjiUMQdcBEHg= +github.com/oxyno-zeta/gomock-extra-matcher v1.2.0/go.mod h1:S0r7HmKeCGsHmvIVFMjKWwswb4+30nCNWbXRMBVPkaU= +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/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 v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= +github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67 h1:jik8PHtAIsPlCRJjJzl4udgEf7hawInF9texMeO2jrU= +github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pierrec/xxHash v0.1.5 h1:n/jBpwTHiER4xYvK3/CdPVnLDPchj8eTJFFLUb4QHBo= +github.com/pierrec/xxHash v0.1.5/go.mod h1:w2waW5Zoa/Wc4Yqe0wgrIYAGKqRMf7czn2HNKXmuL+I= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +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/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +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.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= +github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= +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.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +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.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.52.2 h1:LW8Vk7BccEdONfrJBDffQGRtpSzi5CQaRZGtboOO2ck= +github.com/prometheus/common v0.52.2/go.mod h1:lrWtQx+iDfn2mbH5GUzlH9TSHyfZpHkSiG1W7y3sF2Q= +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.13.0 h1:GqzLlQyfsPbaEHaQkO7tbDlriv/4o5Hudv6OXHGKX7o= +github.com/prometheus/procfs v0.13.0/go.mod h1:cd4PFCR54QLnGKPaKGA6l+cfuNXtht43ZKY6tow0Y1g= +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/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= +github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +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.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo= +github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0= +github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +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/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +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/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +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.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610 h1:4JlsiRVt/YZOvrKH525T7sZXgEWUEjqSDMwE6fXNbdo= +github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610/go.mod h1:kB8gFZX07CyJnw8q9iEZijI3qJTIe1K/Y++P5VGkrcg= +github.com/skip-mev/feemarket v1.0.0 h1:6saDWTgCedMSBur+xLCURtZsxMX/CHmflhA/zuMo+7w= +github.com/skip-mev/feemarket v1.0.0/go.mod h1:52iSehc6mb98xPhRYRqg4crAIxz32RWTbK/LXOwRuf4= +github.com/skip-mev/slinky v1.0.0 h1:4sgHF1H8yrqNn3Uhuw+B11aWIavXgaSiZBZU5/BF/fs= +github.com/skip-mev/slinky v1.0.0/go.mod h1:XRNy7m51XOLtEWN5l3TyKyYkNUL7KL2tuTsYe17LYGE= +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/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +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.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= +github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +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.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +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.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= +github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= +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/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.1.5-0.20170601210322-f6abca593680/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.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= +github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= +github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= +github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI= +github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/tyler-smith/go-bip32 v1.0.0 h1:sDR9juArbUgX+bO/iblgZnMPeWY1KZMUC2AFUJdv5KE= +github.com/tyler-smith/go-bip32 v1.0.0/go.mod h1:onot+eHknzV4BVPwrzqY5OoVpyCvnwD7lMawL5aQupE= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +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/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= +github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +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/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +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.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U= +github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +github.com/zondax/ledger-go v0.14.3 h1:wEpJt2CEcBJ428md/5MgSLsXLBos98sBOyxNmCjfUCw= +github.com/zondax/ledger-go v0.14.3/go.mod h1:IKKaoxupuB43g4NxeQmbLXv7T9AlQyie1UpHb342ycI= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.8 h1:xs88BrvEv273UsB79e0hcVrlUWmS0a8upikMFhSyAtA= +go.etcd.io/bbolt v1.3.8/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +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.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= +go.opentelemetry.io/otel v1.26.0 h1:LQwgL5s/1W7YiiRwxf03QGnWLb2HW4pLiAhaA5cZXBs= +go.opentelemetry.io/otel v1.26.0/go.mod h1:UmLkJHUAidDval2EICqBMbnAd0/m2vmpf/dAM+fvFs4= +go.opentelemetry.io/otel/metric v1.26.0 h1:7S39CLuY5Jgg9CrnA9HHiEjGMF/X2VHvoXGgSllRz30= +go.opentelemetry.io/otel/metric v1.26.0/go.mod h1:SY+rHOI4cEawI9a7N1A4nIg/nTQXe1ccCNWYOJUrpX4= +go.opentelemetry.io/otel/sdk v1.26.0 h1:Y7bumHf5tAiDlRYFmGqetNcLaVUZmh4iYfmGxtmz7F8= +go.opentelemetry.io/otel/sdk v1.26.0/go.mod h1:0p8MXpqLeJ0pzcszQQN4F0S5FVjBLgypeGSngLsmirs= +go.opentelemetry.io/otel/trace v1.26.0 h1:1ieeAUb4y0TE26jUFrCIXKpTuVK7uJGN9/Z/2LP5sQA= +go.opentelemetry.io/otel/trace v1.26.0/go.mod h1:4iDxvGDQuUkHve82hJJ8UqrwswHYsZuWCBllGV2U2y0= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.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/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/mock v0.2.0 h1:TaP3xedm7JaAgScZO7tlvlKrqT0p7I6OsdGB5YNSMDU= +go.uber.org/mock v0.2.0/go.mod h1:J0y0rp9L3xiff1+ZBfKxlC1fz2+aO16tw0tsDOixfuM= +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.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +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.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/crypto v0.0.0-20170613210332-850760c427c5/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-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-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-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-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= +golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/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-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= +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/lint v0.0.0-20210508222113-6edffad5e616/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.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= +golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +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-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +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-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/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-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +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-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/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-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= +golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= +golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +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-20220601150217-0de741cfad7f/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.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +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-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-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-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-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-20200905004654-be1d3432aa8f/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-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/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-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/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-20210616094352-59db8d763f22/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-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/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-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/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-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/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-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/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-20220728004956-3c1f35247d10/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-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +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.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= +golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= +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.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +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.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +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-20190114222345-bf090417da8b/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-20190311212946-11955173bddd/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-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-20190911174233-4f2ddba30aff/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-20200117161641-43d50277825c/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-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +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-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +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-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +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-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= +golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= +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= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +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/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= +google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.180.0 h1:M2D87Yo0rGBPWpo1orwfCLehUUL6E7/TYe5gvMQWDh4= +google.golang.org/api v0.180.0/go.mod h1:51AiyoEg1MJPSZ9zvklA8VnRILPXxn1iVen9v25XHAE= +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-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-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-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= +google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20240401170217-c3f982113cda h1:wu/KJm9KJwpfHWhkkZGohVC6KRrc1oJNr4jwtQMOQXw= +google.golang.org/genproto v0.0.0-20240401170217-c3f982113cda/go.mod h1:g2LLCvCeCSir/JJSWosk19BR4NVxGqHUC6rxIRsd7Aw= +google.golang.org/genproto/googleapis/api v0.0.0-20240610135401-a8a62080eff3 h1:QW9+G6Fir4VcRXVH8x3LilNAb6cxBGLa6+GM4hRwexE= +google.golang.org/genproto/googleapis/api v0.0.0-20240610135401-a8a62080eff3/go.mod h1:kdrSS/OiLkPrNUpzD4aHgCq2rVuC/YRxok32HXZ4vRE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 h1:1GBuWVLM/KMVUv1t1En5Gs+gFZCNd360GGb4sSxtrhU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +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.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.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= +google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +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-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/cheggaaa/pb.v1 v1.0.27/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 h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= +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/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/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +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= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087 h1:Izowp2XBH6Ya6rv+hqbceQyw/gSGoXfH/UPoTGduL54= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= +lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= +lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= +modernc.org/cc/v4 v4.20.0 h1:45Or8mQfbUqJOG9WaxvlFYOAQO0lQ5RvqBcFCXngjxk= +modernc.org/cc/v4 v4.20.0/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ= +modernc.org/ccgo/v4 v4.16.0 h1:ofwORa6vx2FMm0916/CkZjpFPSR70VwTjUCe2Eg5BnA= +modernc.org/ccgo/v4 v4.16.0/go.mod h1:dkNyWIjFrVIZ68DTo36vHK+6/ShBn4ysU61So6PIqCI= +modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE= +modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ= +modernc.org/gc/v2 v2.4.1 h1:9cNzOqPyMJBvrUipmynX0ZohMhcxPtMccYgGOJdOiBw= +modernc.org/gc/v2 v2.4.1/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU= +modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= +modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= +modernc.org/libc v1.49.3 h1:j2MRCRdwJI2ls/sGbeSk0t2bypOG/uvPZUsGQFDulqg= +modernc.org/libc v1.49.3/go.mod h1:yMZuGkn7pXbKfoT/M35gFJOAEdSKdxL0q64sF7KqCDo= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E= +modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU= +modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc= +modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss= +modernc.org/sqlite v1.29.9 h1:9RhNMklxJs+1596GNuAX+O/6040bvOwacTxuFcRuQow= +modernc.org/sqlite v1.29.9/go.mod h1:ItX2a1OVGgNsFh6Dv60JQvGfJfTPHPVpV6DF59akYOA= +modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +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= +pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= +pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= From 4bacc2a3f0c278dedafa842a1b3766397124b3f9 Mon Sep 17 00:00:00 2001 From: aljo242 Date: Mon, 10 Jun 2024 18:01:58 -0400 Subject: [PATCH 02/87] hmm --- app/genesis.go | 2 +- tests/feemarket/e2e_test.go | 26 +++++++++++--------------- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/app/genesis.go b/app/genesis.go index 128ac7806..fa76dfd68 100644 --- a/app/genesis.go +++ b/app/genesis.go @@ -40,7 +40,7 @@ func NewDefaultGenesisState(cdc codec.JSONCodec) GenesisState { DistributeFees: true, }, State: feemarkettypes.State{ - BaseGasPrice: math.LegacyMustNewDecFromStr("0.0025"), + BaseGasPrice: math.LegacyMustNewDecFromStr("0.025"), LearningRate: math.LegacyOneDec(), Window: []uint64{100}, Index: 0, diff --git a/tests/feemarket/e2e_test.go b/tests/feemarket/e2e_test.go index c606a410f..2797dd02b 100644 --- a/tests/feemarket/e2e_test.go +++ b/tests/feemarket/e2e_test.go @@ -30,9 +30,6 @@ func init() { } var ( - minGasPrice = sdkmath.LegacyNewDec(10) - gasPrice = sdkmath.LegacyNewDec(1000000) - image = ibc.DockerImage{ Repository: "neutron-node", Version: "latest", @@ -71,16 +68,15 @@ var ( { Key: "app_state.feemarket.params", Value: feemarkettypes.Params{ - Alpha: feemarkettypes.DefaultAlpha, - Beta: feemarkettypes.DefaultBeta, - Gamma: feemarkettypes.DefaultGamma, - Delta: feemarkettypes.DefaultDelta, - MinBaseGasPrice: minGasPrice, - MinLearningRate: feemarkettypes.DefaultMinLearningRate, - MaxLearningRate: feemarkettypes.DefaultMaxLearningRate, - MaxBlockUtilization: feemarkettypes.DefaultMaxBlockUtilization, - Window: feemarkettypes.DefaultWindow, - FeeDenom: "untrn", + Alpha: sdkmath.LegacyOneDec(), + Beta: sdkmath.LegacyOneDec(), + Delta: sdkmath.LegacyOneDec(), + MinBaseGasPrice: sdkmath.LegacyMustNewDecFromStr("0.0025"), + MinLearningRate: sdkmath.LegacyMustNewDecFromStr("0.5"), + MaxLearningRate: sdkmath.LegacyMustNewDecFromStr("1.5"), + MaxBlockUtilization: 30_000_000, + Window: 1, + FeeDenom: denom, Enabled: true, DistributeFees: false, }, @@ -88,7 +84,7 @@ var ( { Key: "app_state.feemarket.state", Value: feemarkettypes.State{ - BaseGasPrice: gasPrice, + BaseGasPrice: sdkmath.LegacyMustNewDecFromStr("0.025"), LearningRate: feemarkettypes.DefaultMaxLearningRate, Window: make([]uint64, feemarkettypes.DefaultWindow), Index: 0, @@ -117,7 +113,7 @@ var ( Bech32Prefix: "neutron", CoinType: "118", GasAdjustment: gasAdjustment, - GasPrices: fmt.Sprintf("100000%s", denom), + GasPrices: fmt.Sprintf("1000000000%s", denom), TrustingPeriod: "48h", NoHostMount: noHostMount, ModifyGenesis: cosmos.ModifyGenesis(defaultGenesisKV), From 9289bacc877ee362e2f1892905094ed93274a570 Mon Sep 17 00:00:00 2001 From: aljo242 Date: Mon, 10 Jun 2024 18:43:04 -0400 Subject: [PATCH 03/87] ok --- tests/feemarket/e2e_test.go | 7 ++- tests/feemarket/go.mod | 40 +------------ tests/feemarket/go.sum | 115 +++--------------------------------- 3 files changed, 16 insertions(+), 146 deletions(-) diff --git a/tests/feemarket/e2e_test.go b/tests/feemarket/e2e_test.go index 2797dd02b..9f25c8192 100644 --- a/tests/feemarket/e2e_test.go +++ b/tests/feemarket/e2e_test.go @@ -2,6 +2,7 @@ package feemarket_test import ( "fmt" + "strconv" "testing" @@ -16,6 +17,7 @@ import ( "github.com/skip-mev/feemarket/tests/e2e" feemarketmodule "github.com/skip-mev/feemarket/x/feemarket" feemarkettypes "github.com/skip-mev/feemarket/x/feemarket/types" + "github.com/skip-mev/slinky/tests/integration" marketmapmodule "github.com/skip-mev/slinky/x/marketmap" "github.com/skip-mev/slinky/x/oracle" interchaintest "github.com/strangelove-ventures/interchaintest/v8" @@ -71,6 +73,7 @@ var ( Alpha: sdkmath.LegacyOneDec(), Beta: sdkmath.LegacyOneDec(), Delta: sdkmath.LegacyOneDec(), + Gamma: feemarkettypes.DefaultGamma, MinBaseGasPrice: sdkmath.LegacyMustNewDecFromStr("0.0025"), MinLearningRate: sdkmath.LegacyMustNewDecFromStr("0.5"), MaxLearningRate: sdkmath.LegacyMustNewDecFromStr("1.5"), @@ -126,8 +129,8 @@ func TestE2ETestSuite(t *testing.T) { s := e2e.NewIntegrationSuite( spec, oracleImage, - e2e.WithInterchainConstructor(e2e.CCVInterchainConstructor), - e2e.WithChainConstructor(e2e.CCVChainConstructor), + e2e.WithInterchainConstructor(integration.CCVInterchainConstructor), + e2e.WithChainConstructor(integration.CCVChainConstructor), e2e.WithDenom(denom), ) suite.Run(t, s) diff --git a/tests/feemarket/go.mod b/tests/feemarket/go.mod index 18728e364..4bb7038c1 100644 --- a/tests/feemarket/go.mod +++ b/tests/feemarket/go.mod @@ -20,6 +20,7 @@ require ( github.com/skip-mev/feemarket v1.0.0 github.com/skip-mev/feemarket/tests/e2e v1.5.0 github.com/skip-mev/slinky v1.0.0 + github.com/skip-mev/slinky/tests/integration v1.0.1-0.20240607150233-d58cd667a373 github.com/strangelove-ventures/interchaintest/v8 v8.4.0 github.com/stretchr/testify v1.9.0 ) @@ -38,23 +39,15 @@ require ( cosmossdk.io/errors v1.0.1 // indirect cosmossdk.io/log v1.3.1 // indirect cosmossdk.io/store v1.1.0 // indirect - cosmossdk.io/x/evidence v0.1.1 // indirect - cosmossdk.io/x/feegrant v0.1.1 // indirect cosmossdk.io/x/tx v0.13.3 // indirect cosmossdk.io/x/upgrade v0.1.3 // indirect filippo.io/edwards25519 v1.1.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.2 // indirect github.com/BurntSushi/toml v1.4.0 // indirect - github.com/ChainSafe/go-schnorrkel v1.0.0 // indirect - github.com/ChainSafe/go-schnorrkel/1 v0.0.0-00010101000000-000000000000 // indirect - github.com/ComposableFi/go-subkey/v2 v2.0.0-tm03420 // indirect github.com/DataDog/datadog-go v3.2.0+incompatible // indirect github.com/DataDog/zstd v1.5.5 // indirect - github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect - github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/StirlingMarketingGroup/go-namecase v1.0.0 // indirect github.com/avast/retry-go/v4 v4.5.1 // indirect github.com/aws/aws-sdk-go v1.44.224 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -83,14 +76,9 @@ require ( github.com/cosmos/ibc-go/modules/capability v1.0.0 // indirect github.com/cosmos/ibc-go/v8 v8.2.1 // indirect github.com/cosmos/ics23/go v0.10.0 // indirect - github.com/cosmos/interchain-security/v5 v5.0.0 // indirect github.com/cosmos/ledger-cosmos-go v0.13.3 // indirect github.com/danieljoos/wincred v1.2.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/deckarep/golang-set v1.8.0 // indirect - github.com/decred/base58 v1.0.4 // indirect - github.com/decred/dcrd/crypto/blake256 v1.0.1 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v2 v2.0.1 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect github.com/dgraph-io/badger/v2 v2.2007.4 // indirect @@ -103,7 +91,6 @@ require ( github.com/dustin/go-humanize v1.0.1 // indirect github.com/dvsekhvalnov/jose2go v1.7.0 // indirect github.com/emicklei/dot v1.6.2 // indirect - github.com/ethereum/go-ethereum v1.14.4 // indirect github.com/fatih/color v1.17.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect @@ -115,6 +102,7 @@ require ( github.com/go-logr/stdr v1.2.2 // indirect github.com/gobwas/httphead v0.1.0 // indirect github.com/gobwas/pool v0.2.1 // indirect + github.com/goccy/go-json v0.10.2 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.3 // indirect @@ -136,8 +124,6 @@ require ( github.com/grpc-ecosystem/go-grpc-middleware v1.4.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/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-getter v1.7.4 // indirect github.com/hashicorp/go-hclog v1.5.0 // indirect @@ -151,43 +137,28 @@ require ( github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/yamux v0.1.1 // indirect github.com/hdevalence/ed25519consensus v0.1.0 // indirect - github.com/holiman/uint256 v1.2.4 // indirect github.com/huandu/skiplist v1.2.0 // indirect github.com/iancoleman/strcase v0.3.0 // indirect github.com/icza/dyno v0.0.0-20220812133438-f0b6f8a18845 // indirect github.com/improbable-eng/grpc-web v0.15.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/ipfs/go-cid v0.4.1 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jmhodges/levigo v1.0.0 // indirect github.com/klauspost/compress v1.17.8 // indirect - github.com/klauspost/cpuid/v2 v2.2.7 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/lib/pq v1.10.9 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect - github.com/libp2p/go-libp2p v0.31.0 // indirect github.com/linxGnu/grocksdb v1.8.14 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/manifoldco/promptui v0.9.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mimoo/StrobeGo v0.0.0-20220103164710-9a04d6ca976b // indirect github.com/minio/highwayhash v1.0.2 // indirect - github.com/minio/sha256-simd v1.0.1 // indirect - github.com/misko9/go-substrate-rpc-client/v4 v4.0.0-20230913220906-b988ea7da0c2 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/mr-tron/base58 v1.2.0 // indirect github.com/mtibben/percent v0.2.1 // indirect - github.com/multiformats/go-base32 v0.1.0 // indirect - github.com/multiformats/go-base36 v0.2.0 // indirect - github.com/multiformats/go-multiaddr v0.11.0 // indirect - github.com/multiformats/go-multibase v0.2.0 // indirect - github.com/multiformats/go-multicodec v0.9.0 // indirect - github.com/multiformats/go-multihash v0.2.3 // indirect - github.com/multiformats/go-varint v0.0.7 // indirect github.com/ncruces/go-strftime v0.1.9 // indirect github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a // indirect github.com/oklog/run v1.1.0 // indirect @@ -197,7 +168,6 @@ require ( github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67 // indirect - github.com/pierrec/xxHash v0.1.5 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_golang v1.19.1 // indirect @@ -214,7 +184,6 @@ require ( github.com/sasha-s/go-deadlock v0.3.1 // indirect github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610 // indirect github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/spf13/afero v1.11.0 // indirect github.com/spf13/cast v1.6.0 // indirect github.com/spf13/cobra v1.8.0 // indirect @@ -224,8 +193,6 @@ require ( github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/tendermint/go-amino v0.16.0 // indirect github.com/tidwall/btree v1.7.0 // indirect - github.com/tyler-smith/go-bip32 v1.0.0 // indirect - github.com/tyler-smith/go-bip39 v1.1.0 // indirect github.com/ulikunitz/xz v0.5.11 // indirect github.com/zondax/hid v0.9.2 // indirect github.com/zondax/ledger-go v0.14.3 // indirect @@ -256,11 +223,8 @@ require ( google.golang.org/grpc v1.64.0 // indirect google.golang.org/protobuf v1.34.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gotest.tools/v3 v3.5.1 // indirect - lukechampine.com/blake3 v1.2.1 // indirect modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 // indirect modernc.org/libc v1.49.3 // indirect modernc.org/mathutil v1.6.0 // indirect diff --git a/tests/feemarket/go.sum b/tests/feemarket/go.sum index 205601cbc..a2deaafad 100644 --- a/tests/feemarket/go.sum +++ b/tests/feemarket/go.sum @@ -227,20 +227,10 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= 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/ChainSafe/go-schnorrkel v1.0.0 h1:3aDA67lAykLaG1y3AOjs88dMxC88PgUuHRrLeDnvGIM= -github.com/ChainSafe/go-schnorrkel v1.0.0/go.mod h1:dpzHYVxLZcp8pjlV+O+UR8K0Hp/z7vcchBSbMBEhCw4= -github.com/ComposableFi/go-subkey/v2 v2.0.0-tm03420 h1:oknQF/iIhf5lVjbwjsVDzDByupRhga8nhA3NAmwyHDA= -github.com/ComposableFi/go-subkey/v2 v2.0.0-tm03420/go.mod h1:KYkiMX5AbOlXXYfxkrYPrRPV6EbVUALTQh5ptUOJzu8= github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e h1:ahyvB3q25YnZWly5Gq1ekg6jcmWaGj/vG/MhF4aisoc= -github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUqhHd//musdITWjFvNTHn90WG9bMLBEPQZ17Cmlpw= -github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec h1:1Qb69mGp/UtRPn422BH4/Y4Q3SLUrD9KHuDkm8iodFc= -github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec/go.mod h1:CD8UlnlLDiqb36L110uqiP2iSflVjx9g/3U9hCI4q2U= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= @@ -250,10 +240,6 @@ github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= 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 v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= -github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= -github.com/StirlingMarketingGroup/go-namecase v1.0.0 h1:2CzaNtCzc4iNHirR+5ru9OzGg8rQp860gqLBFqRI02Y= -github.com/StirlingMarketingGroup/go-namecase v1.0.0/go.mod h1:ZsoSKcafcAzuBx+sndbxHu/RjDcDTrEdT4UvhniHfio= 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/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= @@ -298,8 +284,6 @@ github.com/btcsuite/btcd/btcutil v1.1.3 h1:xfbtw8lwpp0G6NwSHb+UE67ryTFHJAiNuipus github.com/btcsuite/btcd/btcutil v1.1.3/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= 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/btcutil v1.0.3-0.20201208143702-a53e38424cce h1:YtWJF7RHm2pYCvA5t0RPmAaLUhREsKuKd+SLhxFbFeQ= -github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= github.com/bufbuild/protocompile v0.6.0 h1:Uu7WiSQ6Yj9DbkdnOe7U4mNKp58y9WDMKDn28/ZlunY= github.com/bufbuild/protocompile v0.6.0/go.mod h1:YNP35qEYoYGme7QMtz5SBCoN4kL4g12jTtjuzRNdjpE= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= @@ -328,8 +312,6 @@ github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6D 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/cmars/basen v0.0.0-20150613233007-fe3947df716e h1:0XBUw73chJ1VYSsfvcPvVT7auykAJce9FpRr10L6Qhw= -github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:P13beTBKr5Q18lJe1rIoLUqjM+CB1zYrRg44ZqGuQSA= 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= @@ -342,8 +324,8 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= -github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= @@ -375,7 +357,6 @@ github.com/cosmos/cosmos-proto v1.0.0-beta.5 h1:eNcayDLpip+zVLRLYafhzLvQlSmyab+R github.com/cosmos/cosmos-proto v1.0.0-beta.5/go.mod h1:hQGLpiIUloJBMdQMMWb/4wRApmI9hjHH05nefC0Ojec= github.com/cosmos/cosmos-sdk v0.50.7 h1:LsBGKxifENR/DN4E1RZaitsyL93HU44x0p8EnMHp4V4= github.com/cosmos/cosmos-sdk v0.50.7/go.mod h1:84xDDJEHttRT7NDGwBaUOLVOMN0JNE9x7NbsYIxXs1s= -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/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= @@ -391,8 +372,6 @@ github.com/cosmos/ibc-go/v8 v8.2.1 h1:MTsnZZjxvGD4Fv5pYyx5UkELafSX0rlPt6IfsE2BpT github.com/cosmos/ibc-go/v8 v8.2.1/go.mod h1:wj3qx75iC/XNnsMqbPDCIGs0G6Y3E/lo3bdqCyoCy+8= github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= -github.com/cosmos/interchain-security/v5 v5.0.0 h1:iwHu1nFbXuYfa13isEgm6hkHU+2t/t56YjcfyP3PnQA= -github.com/cosmos/interchain-security/v5 v5.0.0/go.mod h1:h/RkwOppo5AJj+1pkQyfjqU1MPdpohD/S6oEeAXpGZY= github.com/cosmos/ledger-cosmos-go v0.13.3 h1:7ehuBGuyIytsXbd4MP43mLeoN2LTOEnk5nvue4rK+yM= github.com/cosmos/ledger-cosmos-go v0.13.3/go.mod h1:HENcEP+VtahZFw38HZ3+LS3Iv5XV6svsnkk9vdJtLr8= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= @@ -406,19 +385,8 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= -github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= -github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= -github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= -github.com/decred/base58 v1.0.4 h1:QJC6B0E0rXOPA8U/kw2rP+qiRJsUaE2Er+pYb3siUeA= -github.com/decred/base58 v1.0.4/go.mod h1:jJswKPEdvpFpvf7dsDvFZyLT22xZ9lWqEByX38oGd9E= -github.com/decred/dcrd/chaincfg/chainhash v1.0.2 h1:rt5Vlq/jM3ZawwiacWjPa+smINyLRN07EO0cNBV6DGU= -github.com/decred/dcrd/chaincfg/chainhash v1.0.2/go.mod h1:BpbrGgrPTr3YJYRN3Bm+D9NuaFd+zGyNeIKgrhCXK60= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= -github.com/decred/dcrd/dcrec/secp256k1/v2 v2.0.1 h1:18HurQ6DfHeNvwIjvOmrgr44bPdtVaQAe/WWwHg9goM= -github.com/decred/dcrd/dcrec/secp256k1/v2 v2.0.1/go.mod h1:XmyzkaXBy7ZvHdrTAlXAjpog8qKSAWa3ze7yqzWmgmc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= @@ -463,8 +431,6 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum/go-ethereum v1.14.4 h1:AI1778nnI9vb3eCcLo6XTw/lqp6ilVHQmbWmJOUHGU8= -github.com/ethereum/go-ethereum v1.14.4/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= @@ -513,8 +479,6 @@ github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= -github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= 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= @@ -534,9 +498,8 @@ github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u1 github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= github.com/gobwas/pool v0.2.1/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/gobwas/ws v1.2.1 h1:F2aeBZrm2NDsc7vbovKrWSogd4wvfAxg0FQ89/iqOTk= -github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= @@ -688,11 +651,6 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4 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= @@ -721,8 +679,8 @@ github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerX 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.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= -github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= @@ -744,8 +702,6 @@ github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= -github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= -github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= @@ -764,8 +720,6 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= -github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= github.com/jhump/protoreflect v1.15.3 h1:6SFRuqU45u9hIZPJAoZ8c28T3nK64BNdp9w6jFonzls= github.com/jhump/protoreflect v1.15.3/go.mod h1:4ORHmSBmlCW8fh3xHmJMGyul1zNqZK4Elxc8qKP+p1k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -797,8 +751,6 @@ github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8 github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= -github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= 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/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= @@ -816,8 +768,6 @@ github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/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/libp2p/go-libp2p v0.31.0 h1:LFShhP8F6xthWiBBq3euxbKjZsoRajVEyBS9snfHxYg= -github.com/libp2p/go-libp2p v0.31.0/go.mod h1:W/FEK1c/t04PbRH3fA9i5oucu5YcgrG0JVoBWT1B7Eg= 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/linxGnu/grocksdb v1.8.14 h1:HTgyYalNwBSG/1qCQUIott44wU5b2Y9Kr3z7SK5OfGQ= @@ -845,15 +795,8 @@ github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzp github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= 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-20220103164710-9a04d6ca976b h1:QrHweqAtyJ9EwCaGHBu1fghwxIPiopAHV06JlXrMHjk= -github.com/mimoo/StrobeGo v0.0.0-20220103164710-9a04d6ca976b/go.mod h1:xxLb2ip6sSUts3g1irPVHyk/DGslwQsNOo9I7smJfNU= 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/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= -github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= -github.com/misko9/go-substrate-rpc-client/v4 v4.0.0-20230913220906-b988ea7da0c2 h1:G/cVeTAbB9S/6FSWWqpFV0v49hiuHLbJPu9hTZ0UR2A= -github.com/misko9/go-substrate-rpc-client/v4 v4.0.0-20230913220906-b988ea7da0c2/go.mod h1:Q5BxOd9FxJqYp4vCiLGVdetecPcWTmUQIu0bRigYosU= 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= @@ -878,24 +821,8 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= -github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= 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/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= -github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= -github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= -github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= -github.com/multiformats/go-multiaddr v0.11.0 h1:XqGyJ8ufbCE0HmTDwx2kPdsrQ36AGPZNZX6s6xfJH10= -github.com/multiformats/go-multiaddr v0.11.0/go.mod h1:gWUm0QLR4thQ6+ZF6SXUw8YjtwQSPapICM+NmCkxHSM= -github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= -github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= -github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg= -github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= -github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= -github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= -github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= -github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= 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= @@ -932,8 +859,8 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= -github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/onsi/gomega v1.26.0 h1:03cDLK28U6hWvCAns6NeydX3zIm4SF3ci69ulidS32Q= +github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= 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= @@ -951,8 +878,6 @@ github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnh 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/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= -github.com/oxyno-zeta/gomock-extra-matcher v1.2.0 h1:WPEclU0y0PMwUzdDcaKZvld4aXpa3fkzjiUMQdcBEHg= -github.com/oxyno-zeta/gomock-extra-matcher v1.2.0/go.mod h1:S0r7HmKeCGsHmvIVFMjKWwswb4+30nCNWbXRMBVPkaU= 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= @@ -969,8 +894,6 @@ github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67 h1:jik8PHtAIsPlCR github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/xxHash v0.1.5 h1:n/jBpwTHiER4xYvK3/CdPVnLDPchj8eTJFFLUb4QHBo= -github.com/pierrec/xxHash v0.1.5/go.mod h1:w2waW5Zoa/Wc4Yqe0wgrIYAGKqRMf7czn2HNKXmuL+I= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -1046,8 +969,6 @@ github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0 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/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= -github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= 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= @@ -1061,6 +982,8 @@ github.com/skip-mev/feemarket v1.0.0 h1:6saDWTgCedMSBur+xLCURtZsxMX/CHmflhA/zuMo github.com/skip-mev/feemarket v1.0.0/go.mod h1:52iSehc6mb98xPhRYRqg4crAIxz32RWTbK/LXOwRuf4= github.com/skip-mev/slinky v1.0.0 h1:4sgHF1H8yrqNn3Uhuw+B11aWIavXgaSiZBZU5/BF/fs= github.com/skip-mev/slinky v1.0.0/go.mod h1:XRNy7m51XOLtEWN5l3TyKyYkNUL7KL2tuTsYe17LYGE= +github.com/skip-mev/slinky/tests/integration v1.0.1-0.20240607150233-d58cd667a373 h1:OAxFPLsoLVRTyvd8zk26gZHy12qBRLVe8WXC5L5QcTQ= +github.com/skip-mev/slinky/tests/integration v1.0.1-0.20240607150233-d58cd667a373/go.mod h1:MQtr5sHRG9O8Ytl7Anlqs01Cm+DtgP13p+TOn7KPjGo= 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= @@ -1097,7 +1020,6 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.1.5-0.20170601210322-f6abca593680/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= @@ -1119,16 +1041,8 @@ github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2l github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI= github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/tyler-smith/go-bip32 v1.0.0 h1:sDR9juArbUgX+bO/iblgZnMPeWY1KZMUC2AFUJdv5KE= -github.com/tyler-smith/go-bip32 v1.0.0/go.mod h1:onot+eHknzV4BVPwrzqY5OoVpyCvnwD7lMawL5aQupE= -github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= -github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= 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= @@ -1187,8 +1101,6 @@ go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/mock v0.2.0 h1:TaP3xedm7JaAgScZO7tlvlKrqT0p7I6OsdGB5YNSMDU= -go.uber.org/mock v0.2.0/go.mod h1:J0y0rp9L3xiff1+ZBfKxlC1fz2+aO16tw0tsDOixfuM= 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.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= @@ -1200,7 +1112,6 @@ go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -golang.org/x/crypto v0.0.0-20170613210332-850760c427c5/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= @@ -1209,7 +1120,6 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U 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-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-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-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -1453,7 +1363,6 @@ golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= @@ -1801,8 +1710,6 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy 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 h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= 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= @@ -1831,10 +1738,6 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh 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= -launchpad.net/gocheck v0.0.0-20140225173054-000000000087 h1:Izowp2XBH6Ya6rv+hqbceQyw/gSGoXfH/UPoTGduL54= -launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= -lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= -lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= modernc.org/cc/v4 v4.20.0 h1:45Or8mQfbUqJOG9WaxvlFYOAQO0lQ5RvqBcFCXngjxk= modernc.org/cc/v4 v4.20.0/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ= modernc.org/ccgo/v4 v4.16.0 h1:ofwORa6vx2FMm0916/CkZjpFPSR70VwTjUCe2Eg5BnA= From da17f5472553aa6ecd2f233b57e8270c40756585 Mon Sep 17 00:00:00 2001 From: aljo242 Date: Mon, 10 Jun 2024 20:41:25 -0400 Subject: [PATCH 04/87] nice --- tests/e2e/interchain_security_test.go | 4 +- tests/feemarket/e2e_test.go | 39 +++++---- tests/feemarket/go.mod | 40 ++++++++- tests/feemarket/go.sum | 115 ++++++++++++++++++++++++-- 4 files changed, 166 insertions(+), 32 deletions(-) diff --git a/tests/e2e/interchain_security_test.go b/tests/e2e/interchain_security_test.go index 2667325cf..81201ab12 100644 --- a/tests/e2e/interchain_security_test.go +++ b/tests/e2e/interchain_security_test.go @@ -5,13 +5,11 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" appProvider "github.com/cosmos/interchain-security/v5/app/provider" + e2e "github.com/cosmos/interchain-security/v5/tests/integration" icssimapp "github.com/cosmos/interchain-security/v5/testutil/ibc_testing" "github.com/stretchr/testify/suite" - e2e "github.com/cosmos/interchain-security/v5/tests/integration" - appConsumer "github.com/neutron-org/neutron/v4/app" - appparams "github.com/neutron-org/neutron/v4/app/params" "github.com/neutron-org/neutron/v4/testutil" ) diff --git a/tests/feemarket/e2e_test.go b/tests/feemarket/e2e_test.go index 9f25c8192..ea9ccff7d 100644 --- a/tests/feemarket/e2e_test.go +++ b/tests/feemarket/e2e_test.go @@ -1,14 +1,14 @@ package feemarket_test import ( + sdkmath "cosmossdk.io/math" "fmt" - "strconv" + "strings" "testing" "github.com/stretchr/testify/suite" - sdkmath "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module/testutil" "github.com/cosmos/cosmos-sdk/x/auth" @@ -17,7 +17,6 @@ import ( "github.com/skip-mev/feemarket/tests/e2e" feemarketmodule "github.com/skip-mev/feemarket/x/feemarket" feemarkettypes "github.com/skip-mev/feemarket/x/feemarket/types" - "github.com/skip-mev/slinky/tests/integration" marketmapmodule "github.com/skip-mev/slinky/x/marketmap" "github.com/skip-mev/slinky/x/oracle" interchaintest "github.com/strangelove-ventures/interchaintest/v8" @@ -32,6 +31,9 @@ func init() { } var ( + minBaseGasPrice = sdkmath.LegacyMustNewDecFromStr("0.001") + baseGasPrice = sdkmath.LegacyMustNewDecFromStr("0.1") + image = ibc.DockerImage{ Repository: "neutron-node", Version: "latest", @@ -47,7 +49,7 @@ var ( numValidators = 4 numFullNodes = 0 noHostMount = false - gasAdjustment = 1.5 + gasAdjustment = 2.0 encodingConfig = testutil.MakeTestEncodingConfig( bank.AppModuleBasic{}, @@ -70,16 +72,16 @@ var ( { Key: "app_state.feemarket.params", Value: feemarkettypes.Params{ - Alpha: sdkmath.LegacyOneDec(), - Beta: sdkmath.LegacyOneDec(), - Delta: sdkmath.LegacyOneDec(), - Gamma: feemarkettypes.DefaultGamma, - MinBaseGasPrice: sdkmath.LegacyMustNewDecFromStr("0.0025"), - MinLearningRate: sdkmath.LegacyMustNewDecFromStr("0.5"), - MaxLearningRate: sdkmath.LegacyMustNewDecFromStr("1.5"), - MaxBlockUtilization: 30_000_000, - Window: 1, - FeeDenom: denom, + Alpha: feemarkettypes.DefaultAlpha, + Beta: feemarkettypes.DefaultBeta, + Gamma: feemarkettypes.DefaultAIMDGamma, + Delta: feemarkettypes.DefaultDelta, + MinBaseGasPrice: minBaseGasPrice, + MinLearningRate: feemarkettypes.DefaultMinLearningRate, + MaxLearningRate: feemarkettypes.DefaultMaxLearningRate, + MaxBlockUtilization: feemarkettypes.DefaultMaxBlockUtilization, + Window: feemarkettypes.DefaultWindow, + FeeDenom: feemarkettypes.DefaultFeeDenom, Enabled: true, DistributeFees: false, }, @@ -87,7 +89,7 @@ var ( { Key: "app_state.feemarket.state", Value: feemarkettypes.State{ - BaseGasPrice: sdkmath.LegacyMustNewDecFromStr("0.025"), + BaseGasPrice: baseGasPrice, LearningRate: feemarkettypes.DefaultMaxLearningRate, Window: make([]uint64, feemarkettypes.DefaultWindow), Index: 0, @@ -116,7 +118,7 @@ var ( Bech32Prefix: "neutron", CoinType: "118", GasAdjustment: gasAdjustment, - GasPrices: fmt.Sprintf("1000000000%s", denom), + GasPrices: fmt.Sprintf("10%s", denom), TrustingPeriod: "48h", NoHostMount: noHostMount, ModifyGenesis: cosmos.ModifyGenesis(defaultGenesisKV), @@ -129,9 +131,10 @@ func TestE2ETestSuite(t *testing.T) { s := e2e.NewIntegrationSuite( spec, oracleImage, - e2e.WithInterchainConstructor(integration.CCVInterchainConstructor), - e2e.WithChainConstructor(integration.CCVChainConstructor), + e2e.WithInterchainConstructor(e2e.CCVInterchainConstructor), + e2e.WithChainConstructor(e2e.CCVChainConstructor), e2e.WithDenom(denom), + e2e.WithGasPrices(strings.Join([]string{"0.0uatom"}, ",")), ) suite.Run(t, s) } diff --git a/tests/feemarket/go.mod b/tests/feemarket/go.mod index 4bb7038c1..18728e364 100644 --- a/tests/feemarket/go.mod +++ b/tests/feemarket/go.mod @@ -20,7 +20,6 @@ require ( github.com/skip-mev/feemarket v1.0.0 github.com/skip-mev/feemarket/tests/e2e v1.5.0 github.com/skip-mev/slinky v1.0.0 - github.com/skip-mev/slinky/tests/integration v1.0.1-0.20240607150233-d58cd667a373 github.com/strangelove-ventures/interchaintest/v8 v8.4.0 github.com/stretchr/testify v1.9.0 ) @@ -39,15 +38,23 @@ require ( cosmossdk.io/errors v1.0.1 // indirect cosmossdk.io/log v1.3.1 // indirect cosmossdk.io/store v1.1.0 // indirect + cosmossdk.io/x/evidence v0.1.1 // indirect + cosmossdk.io/x/feegrant v0.1.1 // indirect cosmossdk.io/x/tx v0.13.3 // indirect cosmossdk.io/x/upgrade v0.1.3 // indirect filippo.io/edwards25519 v1.1.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.2 // indirect github.com/BurntSushi/toml v1.4.0 // indirect + github.com/ChainSafe/go-schnorrkel v1.0.0 // indirect + github.com/ChainSafe/go-schnorrkel/1 v0.0.0-00010101000000-000000000000 // indirect + github.com/ComposableFi/go-subkey/v2 v2.0.0-tm03420 // indirect github.com/DataDog/datadog-go v3.2.0+incompatible // indirect github.com/DataDog/zstd v1.5.5 // indirect + github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect + github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/StirlingMarketingGroup/go-namecase v1.0.0 // indirect github.com/avast/retry-go/v4 v4.5.1 // indirect github.com/aws/aws-sdk-go v1.44.224 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -76,9 +83,14 @@ require ( github.com/cosmos/ibc-go/modules/capability v1.0.0 // indirect github.com/cosmos/ibc-go/v8 v8.2.1 // indirect github.com/cosmos/ics23/go v0.10.0 // indirect + github.com/cosmos/interchain-security/v5 v5.0.0 // indirect github.com/cosmos/ledger-cosmos-go v0.13.3 // indirect github.com/danieljoos/wincred v1.2.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/deckarep/golang-set v1.8.0 // indirect + github.com/decred/base58 v1.0.4 // indirect + github.com/decred/dcrd/crypto/blake256 v1.0.1 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v2 v2.0.1 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect github.com/dgraph-io/badger/v2 v2.2007.4 // indirect @@ -91,6 +103,7 @@ require ( github.com/dustin/go-humanize v1.0.1 // indirect github.com/dvsekhvalnov/jose2go v1.7.0 // indirect github.com/emicklei/dot v1.6.2 // indirect + github.com/ethereum/go-ethereum v1.14.4 // indirect github.com/fatih/color v1.17.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect @@ -102,7 +115,6 @@ require ( github.com/go-logr/stdr v1.2.2 // indirect github.com/gobwas/httphead v0.1.0 // indirect github.com/gobwas/pool v0.2.1 // indirect - github.com/goccy/go-json v0.10.2 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.3 // indirect @@ -124,6 +136,8 @@ require ( github.com/grpc-ecosystem/go-grpc-middleware v1.4.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/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-getter v1.7.4 // indirect github.com/hashicorp/go-hclog v1.5.0 // indirect @@ -137,28 +151,43 @@ require ( github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/yamux v0.1.1 // indirect github.com/hdevalence/ed25519consensus v0.1.0 // indirect + github.com/holiman/uint256 v1.2.4 // indirect github.com/huandu/skiplist v1.2.0 // indirect github.com/iancoleman/strcase v0.3.0 // indirect github.com/icza/dyno v0.0.0-20220812133438-f0b6f8a18845 // indirect github.com/improbable-eng/grpc-web v0.15.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/ipfs/go-cid v0.4.1 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jmhodges/levigo v1.0.0 // indirect github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/cpuid/v2 v2.2.7 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/lib/pq v1.10.9 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect + github.com/libp2p/go-libp2p v0.31.0 // indirect github.com/linxGnu/grocksdb v1.8.14 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/manifoldco/promptui v0.9.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mimoo/StrobeGo v0.0.0-20220103164710-9a04d6ca976b // indirect github.com/minio/highwayhash v1.0.2 // indirect + github.com/minio/sha256-simd v1.0.1 // indirect + github.com/misko9/go-substrate-rpc-client/v4 v4.0.0-20230913220906-b988ea7da0c2 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mr-tron/base58 v1.2.0 // indirect github.com/mtibben/percent v0.2.1 // indirect + github.com/multiformats/go-base32 v0.1.0 // indirect + github.com/multiformats/go-base36 v0.2.0 // indirect + github.com/multiformats/go-multiaddr v0.11.0 // indirect + github.com/multiformats/go-multibase v0.2.0 // indirect + github.com/multiformats/go-multicodec v0.9.0 // indirect + github.com/multiformats/go-multihash v0.2.3 // indirect + github.com/multiformats/go-varint v0.0.7 // indirect github.com/ncruces/go-strftime v0.1.9 // indirect github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a // indirect github.com/oklog/run v1.1.0 // indirect @@ -168,6 +197,7 @@ require ( github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67 // indirect + github.com/pierrec/xxHash v0.1.5 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_golang v1.19.1 // indirect @@ -184,6 +214,7 @@ require ( github.com/sasha-s/go-deadlock v0.3.1 // indirect github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610 // indirect github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/spf13/afero v1.11.0 // indirect github.com/spf13/cast v1.6.0 // indirect github.com/spf13/cobra v1.8.0 // indirect @@ -193,6 +224,8 @@ require ( github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/tendermint/go-amino v0.16.0 // indirect github.com/tidwall/btree v1.7.0 // indirect + github.com/tyler-smith/go-bip32 v1.0.0 // indirect + github.com/tyler-smith/go-bip39 v1.1.0 // indirect github.com/ulikunitz/xz v0.5.11 // indirect github.com/zondax/hid v0.9.2 // indirect github.com/zondax/ledger-go v0.14.3 // indirect @@ -223,8 +256,11 @@ require ( google.golang.org/grpc v1.64.0 // indirect google.golang.org/protobuf v1.34.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gotest.tools/v3 v3.5.1 // indirect + lukechampine.com/blake3 v1.2.1 // indirect modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 // indirect modernc.org/libc v1.49.3 // indirect modernc.org/mathutil v1.6.0 // indirect diff --git a/tests/feemarket/go.sum b/tests/feemarket/go.sum index a2deaafad..205601cbc 100644 --- a/tests/feemarket/go.sum +++ b/tests/feemarket/go.sum @@ -227,10 +227,20 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= 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/ChainSafe/go-schnorrkel v1.0.0 h1:3aDA67lAykLaG1y3AOjs88dMxC88PgUuHRrLeDnvGIM= +github.com/ChainSafe/go-schnorrkel v1.0.0/go.mod h1:dpzHYVxLZcp8pjlV+O+UR8K0Hp/z7vcchBSbMBEhCw4= +github.com/ComposableFi/go-subkey/v2 v2.0.0-tm03420 h1:oknQF/iIhf5lVjbwjsVDzDByupRhga8nhA3NAmwyHDA= +github.com/ComposableFi/go-subkey/v2 v2.0.0-tm03420/go.mod h1:KYkiMX5AbOlXXYfxkrYPrRPV6EbVUALTQh5ptUOJzu8= github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e h1:ahyvB3q25YnZWly5Gq1ekg6jcmWaGj/vG/MhF4aisoc= +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUqhHd//musdITWjFvNTHn90WG9bMLBEPQZ17Cmlpw= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec h1:1Qb69mGp/UtRPn422BH4/Y4Q3SLUrD9KHuDkm8iodFc= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec/go.mod h1:CD8UlnlLDiqb36L110uqiP2iSflVjx9g/3U9hCI4q2U= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= @@ -240,6 +250,10 @@ github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= 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 v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= +github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= +github.com/StirlingMarketingGroup/go-namecase v1.0.0 h1:2CzaNtCzc4iNHirR+5ru9OzGg8rQp860gqLBFqRI02Y= +github.com/StirlingMarketingGroup/go-namecase v1.0.0/go.mod h1:ZsoSKcafcAzuBx+sndbxHu/RjDcDTrEdT4UvhniHfio= 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/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= @@ -284,6 +298,8 @@ github.com/btcsuite/btcd/btcutil v1.1.3 h1:xfbtw8lwpp0G6NwSHb+UE67ryTFHJAiNuipus github.com/btcsuite/btcd/btcutil v1.1.3/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= 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/btcutil v1.0.3-0.20201208143702-a53e38424cce h1:YtWJF7RHm2pYCvA5t0RPmAaLUhREsKuKd+SLhxFbFeQ= +github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= github.com/bufbuild/protocompile v0.6.0 h1:Uu7WiSQ6Yj9DbkdnOe7U4mNKp58y9WDMKDn28/ZlunY= github.com/bufbuild/protocompile v0.6.0/go.mod h1:YNP35qEYoYGme7QMtz5SBCoN4kL4g12jTtjuzRNdjpE= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= @@ -312,6 +328,8 @@ github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6D 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/cmars/basen v0.0.0-20150613233007-fe3947df716e h1:0XBUw73chJ1VYSsfvcPvVT7auykAJce9FpRr10L6Qhw= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:P13beTBKr5Q18lJe1rIoLUqjM+CB1zYrRg44ZqGuQSA= 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= @@ -324,8 +342,8 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= -github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= @@ -357,6 +375,7 @@ github.com/cosmos/cosmos-proto v1.0.0-beta.5 h1:eNcayDLpip+zVLRLYafhzLvQlSmyab+R github.com/cosmos/cosmos-proto v1.0.0-beta.5/go.mod h1:hQGLpiIUloJBMdQMMWb/4wRApmI9hjHH05nefC0Ojec= github.com/cosmos/cosmos-sdk v0.50.7 h1:LsBGKxifENR/DN4E1RZaitsyL93HU44x0p8EnMHp4V4= github.com/cosmos/cosmos-sdk v0.50.7/go.mod h1:84xDDJEHttRT7NDGwBaUOLVOMN0JNE9x7NbsYIxXs1s= +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/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= @@ -372,6 +391,8 @@ github.com/cosmos/ibc-go/v8 v8.2.1 h1:MTsnZZjxvGD4Fv5pYyx5UkELafSX0rlPt6IfsE2BpT github.com/cosmos/ibc-go/v8 v8.2.1/go.mod h1:wj3qx75iC/XNnsMqbPDCIGs0G6Y3E/lo3bdqCyoCy+8= github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= +github.com/cosmos/interchain-security/v5 v5.0.0 h1:iwHu1nFbXuYfa13isEgm6hkHU+2t/t56YjcfyP3PnQA= +github.com/cosmos/interchain-security/v5 v5.0.0/go.mod h1:h/RkwOppo5AJj+1pkQyfjqU1MPdpohD/S6oEeAXpGZY= github.com/cosmos/ledger-cosmos-go v0.13.3 h1:7ehuBGuyIytsXbd4MP43mLeoN2LTOEnk5nvue4rK+yM= github.com/cosmos/ledger-cosmos-go v0.13.3/go.mod h1:HENcEP+VtahZFw38HZ3+LS3Iv5XV6svsnkk9vdJtLr8= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= @@ -385,8 +406,19 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= +github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/decred/base58 v1.0.4 h1:QJC6B0E0rXOPA8U/kw2rP+qiRJsUaE2Er+pYb3siUeA= +github.com/decred/base58 v1.0.4/go.mod h1:jJswKPEdvpFpvf7dsDvFZyLT22xZ9lWqEByX38oGd9E= +github.com/decred/dcrd/chaincfg/chainhash v1.0.2 h1:rt5Vlq/jM3ZawwiacWjPa+smINyLRN07EO0cNBV6DGU= +github.com/decred/dcrd/chaincfg/chainhash v1.0.2/go.mod h1:BpbrGgrPTr3YJYRN3Bm+D9NuaFd+zGyNeIKgrhCXK60= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/dcrec/secp256k1/v2 v2.0.1 h1:18HurQ6DfHeNvwIjvOmrgr44bPdtVaQAe/WWwHg9goM= +github.com/decred/dcrd/dcrec/secp256k1/v2 v2.0.1/go.mod h1:XmyzkaXBy7ZvHdrTAlXAjpog8qKSAWa3ze7yqzWmgmc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= @@ -431,6 +463,8 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/ethereum/go-ethereum v1.14.4 h1:AI1778nnI9vb3eCcLo6XTw/lqp6ilVHQmbWmJOUHGU8= +github.com/ethereum/go-ethereum v1.14.4/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= @@ -479,6 +513,8 @@ github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= 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= @@ -498,8 +534,9 @@ github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u1 github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= github.com/gobwas/pool v0.2.1/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/gobwas/ws v1.2.1 h1:F2aeBZrm2NDsc7vbovKrWSogd4wvfAxg0FQ89/iqOTk= +github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= @@ -651,6 +688,11 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4 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= @@ -679,8 +721,8 @@ github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerX 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-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= @@ -702,6 +744,8 @@ github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= @@ -720,6 +764,8 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= +github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= github.com/jhump/protoreflect v1.15.3 h1:6SFRuqU45u9hIZPJAoZ8c28T3nK64BNdp9w6jFonzls= github.com/jhump/protoreflect v1.15.3/go.mod h1:4ORHmSBmlCW8fh3xHmJMGyul1zNqZK4Elxc8qKP+p1k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -751,6 +797,8 @@ github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8 github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= 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/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= @@ -768,6 +816,8 @@ github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/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/libp2p/go-libp2p v0.31.0 h1:LFShhP8F6xthWiBBq3euxbKjZsoRajVEyBS9snfHxYg= +github.com/libp2p/go-libp2p v0.31.0/go.mod h1:W/FEK1c/t04PbRH3fA9i5oucu5YcgrG0JVoBWT1B7Eg= 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/linxGnu/grocksdb v1.8.14 h1:HTgyYalNwBSG/1qCQUIott44wU5b2Y9Kr3z7SK5OfGQ= @@ -795,8 +845,15 @@ github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzp github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= 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-20220103164710-9a04d6ca976b h1:QrHweqAtyJ9EwCaGHBu1fghwxIPiopAHV06JlXrMHjk= +github.com/mimoo/StrobeGo v0.0.0-20220103164710-9a04d6ca976b/go.mod h1:xxLb2ip6sSUts3g1irPVHyk/DGslwQsNOo9I7smJfNU= 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/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= +github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= +github.com/misko9/go-substrate-rpc-client/v4 v4.0.0-20230913220906-b988ea7da0c2 h1:G/cVeTAbB9S/6FSWWqpFV0v49hiuHLbJPu9hTZ0UR2A= +github.com/misko9/go-substrate-rpc-client/v4 v4.0.0-20230913220906-b988ea7da0c2/go.mod h1:Q5BxOd9FxJqYp4vCiLGVdetecPcWTmUQIu0bRigYosU= 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= @@ -821,8 +878,24 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= +github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= 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/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= +github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= +github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= +github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= +github.com/multiformats/go-multiaddr v0.11.0 h1:XqGyJ8ufbCE0HmTDwx2kPdsrQ36AGPZNZX6s6xfJH10= +github.com/multiformats/go-multiaddr v0.11.0/go.mod h1:gWUm0QLR4thQ6+ZF6SXUw8YjtwQSPapICM+NmCkxHSM= +github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= +github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= +github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg= +github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= +github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= +github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= +github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= +github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= 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= @@ -859,8 +932,8 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/onsi/gomega v1.26.0 h1:03cDLK28U6hWvCAns6NeydX3zIm4SF3ci69ulidS32Q= -github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= 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= @@ -878,6 +951,8 @@ github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnh 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/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= +github.com/oxyno-zeta/gomock-extra-matcher v1.2.0 h1:WPEclU0y0PMwUzdDcaKZvld4aXpa3fkzjiUMQdcBEHg= +github.com/oxyno-zeta/gomock-extra-matcher v1.2.0/go.mod h1:S0r7HmKeCGsHmvIVFMjKWwswb4+30nCNWbXRMBVPkaU= 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= @@ -894,6 +969,8 @@ github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67 h1:jik8PHtAIsPlCR github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pierrec/xxHash v0.1.5 h1:n/jBpwTHiER4xYvK3/CdPVnLDPchj8eTJFFLUb4QHBo= +github.com/pierrec/xxHash v0.1.5/go.mod h1:w2waW5Zoa/Wc4Yqe0wgrIYAGKqRMf7czn2HNKXmuL+I= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -969,6 +1046,8 @@ github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0 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/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= 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= @@ -982,8 +1061,6 @@ github.com/skip-mev/feemarket v1.0.0 h1:6saDWTgCedMSBur+xLCURtZsxMX/CHmflhA/zuMo github.com/skip-mev/feemarket v1.0.0/go.mod h1:52iSehc6mb98xPhRYRqg4crAIxz32RWTbK/LXOwRuf4= github.com/skip-mev/slinky v1.0.0 h1:4sgHF1H8yrqNn3Uhuw+B11aWIavXgaSiZBZU5/BF/fs= github.com/skip-mev/slinky v1.0.0/go.mod h1:XRNy7m51XOLtEWN5l3TyKyYkNUL7KL2tuTsYe17LYGE= -github.com/skip-mev/slinky/tests/integration v1.0.1-0.20240607150233-d58cd667a373 h1:OAxFPLsoLVRTyvd8zk26gZHy12qBRLVe8WXC5L5QcTQ= -github.com/skip-mev/slinky/tests/integration v1.0.1-0.20240607150233-d58cd667a373/go.mod h1:MQtr5sHRG9O8Ytl7Anlqs01Cm+DtgP13p+TOn7KPjGo= 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= @@ -1020,6 +1097,7 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.1.5-0.20170601210322-f6abca593680/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= @@ -1041,8 +1119,16 @@ github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2l github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI= github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/tyler-smith/go-bip32 v1.0.0 h1:sDR9juArbUgX+bO/iblgZnMPeWY1KZMUC2AFUJdv5KE= +github.com/tyler-smith/go-bip32 v1.0.0/go.mod h1:onot+eHknzV4BVPwrzqY5OoVpyCvnwD7lMawL5aQupE= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= 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= @@ -1101,6 +1187,8 @@ go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/mock v0.2.0 h1:TaP3xedm7JaAgScZO7tlvlKrqT0p7I6OsdGB5YNSMDU= +go.uber.org/mock v0.2.0/go.mod h1:J0y0rp9L3xiff1+ZBfKxlC1fz2+aO16tw0tsDOixfuM= 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.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= @@ -1112,6 +1200,7 @@ go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/crypto v0.0.0-20170613210332-850760c427c5/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= @@ -1120,6 +1209,7 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U 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-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-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-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -1363,6 +1453,7 @@ golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= @@ -1710,6 +1801,8 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy 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 h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= 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= @@ -1738,6 +1831,10 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh 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= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087 h1:Izowp2XBH6Ya6rv+hqbceQyw/gSGoXfH/UPoTGduL54= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= +lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= +lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= modernc.org/cc/v4 v4.20.0 h1:45Or8mQfbUqJOG9WaxvlFYOAQO0lQ5RvqBcFCXngjxk= modernc.org/cc/v4 v4.20.0/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ= modernc.org/ccgo/v4 v4.16.0 h1:ofwORa6vx2FMm0916/CkZjpFPSR70VwTjUCe2Eg5BnA= From bfac4b73dd4fa15606e0187e2e0639e7b7921daf Mon Sep 17 00:00:00 2001 From: aljo242 Date: Tue, 11 Jun 2024 13:20:30 -0400 Subject: [PATCH 05/87] working --- tests/feemarket/e2e_test.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/tests/feemarket/e2e_test.go b/tests/feemarket/e2e_test.go index ea9ccff7d..a79fdbddd 100644 --- a/tests/feemarket/e2e_test.go +++ b/tests/feemarket/e2e_test.go @@ -1,14 +1,12 @@ package feemarket_test import ( - sdkmath "cosmossdk.io/math" "fmt" "strconv" "strings" "testing" - "github.com/stretchr/testify/suite" - + sdkmath "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module/testutil" "github.com/cosmos/cosmos-sdk/x/auth" @@ -22,6 +20,7 @@ import ( interchaintest "github.com/strangelove-ventures/interchaintest/v8" "github.com/strangelove-ventures/interchaintest/v8/chain/cosmos" "github.com/strangelove-ventures/interchaintest/v8/ibc" + "github.com/stretchr/testify/suite" ) func init() { @@ -32,7 +31,7 @@ func init() { var ( minBaseGasPrice = sdkmath.LegacyMustNewDecFromStr("0.001") - baseGasPrice = sdkmath.LegacyMustNewDecFromStr("0.1") + baseGasPrice = sdkmath.LegacyMustNewDecFromStr("0.01") image = ibc.DockerImage{ Repository: "neutron-node", @@ -79,9 +78,9 @@ var ( MinBaseGasPrice: minBaseGasPrice, MinLearningRate: feemarkettypes.DefaultMinLearningRate, MaxLearningRate: feemarkettypes.DefaultMaxLearningRate, - MaxBlockUtilization: feemarkettypes.DefaultMaxBlockUtilization, + MaxBlockUtilization: 15_000_000, Window: feemarkettypes.DefaultWindow, - FeeDenom: feemarkettypes.DefaultFeeDenom, + FeeDenom: denom, Enabled: true, DistributeFees: false, }, @@ -125,12 +124,19 @@ var ( SkipGenTx: true, }, } + + txCfg = e2e.TestTxConfig{ + SmallSendsNum: 1, + LargeSendsNum: 325, + TargetIncreaseGasPrice: sdkmath.LegacyMustNewDecFromStr("0.0011"), + } ) func TestE2ETestSuite(t *testing.T) { s := e2e.NewIntegrationSuite( spec, oracleImage, + txCfg, e2e.WithInterchainConstructor(e2e.CCVInterchainConstructor), e2e.WithChainConstructor(e2e.CCVChainConstructor), e2e.WithDenom(denom), From 8a24224904c1a4d76a9bad5d8b367809ddbe5098 Mon Sep 17 00:00:00 2001 From: aljo242 Date: Tue, 11 Jun 2024 14:46:31 -0400 Subject: [PATCH 06/87] nice --- tests/feemarket/go.mod | 5 ++--- tests/feemarket/go.sum | 4 ++++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/feemarket/go.mod b/tests/feemarket/go.mod index 18728e364..5ce8c9f1f 100644 --- a/tests/feemarket/go.mod +++ b/tests/feemarket/go.mod @@ -9,8 +9,7 @@ replace ( github.com/docker/distribution => github.com/docker/distribution v2.8.2+incompatible github.com/docker/docker => github.com/docker/docker v24.0.9+incompatible github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 - github.com/skip-mev/feemarket/tests/e2e => ../../../feemarket/tests/e2e - github.com/strangelove-ventures/interchaintest/v8 => ../../../interchaintest + github.com/strangelove-ventures/interchaintest/v8 => github.com/skip-mev/interchaintest/v8 v8.0.1-0.20240611183342-72ec508eb966 github.com/vedhavyas/go-subkey => github.com/strangelove-ventures/go-subkey v1.0.7 ) @@ -18,7 +17,7 @@ require ( cosmossdk.io/math v1.3.0 github.com/cosmos/cosmos-sdk v0.50.7 github.com/skip-mev/feemarket v1.0.0 - github.com/skip-mev/feemarket/tests/e2e v1.5.0 + github.com/skip-mev/feemarket/tests/e2e v1.6.0 github.com/skip-mev/slinky v1.0.0 github.com/strangelove-ventures/interchaintest/v8 v8.4.0 github.com/stretchr/testify v1.9.0 diff --git a/tests/feemarket/go.sum b/tests/feemarket/go.sum index 205601cbc..dd8f076f4 100644 --- a/tests/feemarket/go.sum +++ b/tests/feemarket/go.sum @@ -1059,6 +1059,10 @@ github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610 h1:4JlsiRVt github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610/go.mod h1:kB8gFZX07CyJnw8q9iEZijI3qJTIe1K/Y++P5VGkrcg= github.com/skip-mev/feemarket v1.0.0 h1:6saDWTgCedMSBur+xLCURtZsxMX/CHmflhA/zuMo+7w= github.com/skip-mev/feemarket v1.0.0/go.mod h1:52iSehc6mb98xPhRYRqg4crAIxz32RWTbK/LXOwRuf4= +github.com/skip-mev/feemarket/tests/e2e v1.6.0 h1:kGf32G/2vvLUBDYxjUHCR7+WSE97AjNGMbU4xNuQj7M= +github.com/skip-mev/feemarket/tests/e2e v1.6.0/go.mod h1:0OGXj14idjYg9jOzydF3fbYXBARDqTGY8MADvFxnU5A= +github.com/skip-mev/interchaintest/v8 v8.0.1-0.20240611183342-72ec508eb966 h1:X5BD7m4QieHlORqGho1Af8r0O1GSWBRYO330xyu2kzQ= +github.com/skip-mev/interchaintest/v8 v8.0.1-0.20240611183342-72ec508eb966/go.mod h1:nfPgRi1yjnzi+qF+0Fs9qN9kkS1Fk0oqgpKvqg5a200= github.com/skip-mev/slinky v1.0.0 h1:4sgHF1H8yrqNn3Uhuw+B11aWIavXgaSiZBZU5/BF/fs= github.com/skip-mev/slinky v1.0.0/go.mod h1:XRNy7m51XOLtEWN5l3TyKyYkNUL7KL2tuTsYe17LYGE= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= From 1886fb434213d438e0a62d3f0e73af92e885757f Mon Sep 17 00:00:00 2001 From: aljo242 Date: Tue, 11 Jun 2024 14:47:58 -0400 Subject: [PATCH 07/87] ok --- app/genesis.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/genesis.go b/app/genesis.go index fa76dfd68..128ac7806 100644 --- a/app/genesis.go +++ b/app/genesis.go @@ -40,7 +40,7 @@ func NewDefaultGenesisState(cdc codec.JSONCodec) GenesisState { DistributeFees: true, }, State: feemarkettypes.State{ - BaseGasPrice: math.LegacyMustNewDecFromStr("0.025"), + BaseGasPrice: math.LegacyMustNewDecFromStr("0.0025"), LearningRate: math.LegacyOneDec(), Window: []uint64{100}, Index: 0, From 0ef23b35a56a0c2f2378e901ef8fb86a19f9f673 Mon Sep 17 00:00:00 2001 From: aljo242 Date: Tue, 11 Jun 2024 15:42:20 -0400 Subject: [PATCH 08/87] bump --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index eace518d5..c3240e028 100644 --- a/go.mod +++ b/go.mod @@ -38,7 +38,7 @@ require ( github.com/prometheus/client_golang v1.19.1 github.com/rs/zerolog v1.32.0 github.com/skip-mev/block-sdk/v2 v2.1.2 - github.com/skip-mev/feemarket v1.0.0 + github.com/skip-mev/feemarket v1.0.1 github.com/skip-mev/slinky v1.0.0 github.com/spf13/cast v1.6.0 github.com/spf13/cobra v1.8.0 From a79c993e8924fbd30e33a1cf88bbd89096a73110 Mon Sep 17 00:00:00 2001 From: aljo242 Date: Tue, 11 Jun 2024 15:43:16 -0400 Subject: [PATCH 09/87] bump --- go.sum | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/go.sum b/go.sum index 971506c0f..7c45f399e 100644 --- a/go.sum +++ b/go.sum @@ -1078,8 +1078,8 @@ github.com/skip-mev/block-sdk/v2 v2.1.2 h1:fNKbrb+PVVzuU0JiSuWgBV4Afj5zZ1VeHQJp8 github.com/skip-mev/block-sdk/v2 v2.1.2/go.mod h1:kIq7SMva0/eHKTCiG/oI5XGxD4HNVK0t71TrUZqHcvA= github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610 h1:4JlsiRVt/YZOvrKH525T7sZXgEWUEjqSDMwE6fXNbdo= github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610/go.mod h1:kB8gFZX07CyJnw8q9iEZijI3qJTIe1K/Y++P5VGkrcg= -github.com/skip-mev/feemarket v1.0.0 h1:6saDWTgCedMSBur+xLCURtZsxMX/CHmflhA/zuMo+7w= -github.com/skip-mev/feemarket v1.0.0/go.mod h1:52iSehc6mb98xPhRYRqg4crAIxz32RWTbK/LXOwRuf4= +github.com/skip-mev/feemarket v1.0.1 h1:Bkn7ELhaqYppki1c9eWQw3fEYsGXXeHng9VxD4AdMBY= +github.com/skip-mev/feemarket v1.0.1/go.mod h1:52iSehc6mb98xPhRYRqg4crAIxz32RWTbK/LXOwRuf4= github.com/skip-mev/slinky v1.0.0 h1:4sgHF1H8yrqNn3Uhuw+B11aWIavXgaSiZBZU5/BF/fs= github.com/skip-mev/slinky v1.0.0/go.mod h1:XRNy7m51XOLtEWN5l3TyKyYkNUL7KL2tuTsYe17LYGE= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= From a06e4a9e4fd0ae5cfc4728b117e16d2f8c3c3723 Mon Sep 17 00:00:00 2001 From: aljo242 Date: Wed, 12 Jun 2024 11:07:15 -0400 Subject: [PATCH 10/87] new --- tests/feemarket/go.mod | 4 ++-- tests/feemarket/go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/feemarket/go.mod b/tests/feemarket/go.mod index 5ce8c9f1f..01f5d008d 100644 --- a/tests/feemarket/go.mod +++ b/tests/feemarket/go.mod @@ -16,8 +16,8 @@ replace ( require ( cosmossdk.io/math v1.3.0 github.com/cosmos/cosmos-sdk v0.50.7 - github.com/skip-mev/feemarket v1.0.0 - github.com/skip-mev/feemarket/tests/e2e v1.6.0 + github.com/skip-mev/feemarket v1.0.1 + github.com/skip-mev/feemarket/tests/e2e v1.10.0 github.com/skip-mev/slinky v1.0.0 github.com/strangelove-ventures/interchaintest/v8 v8.4.0 github.com/stretchr/testify v1.9.0 diff --git a/tests/feemarket/go.sum b/tests/feemarket/go.sum index dd8f076f4..331dc0e1e 100644 --- a/tests/feemarket/go.sum +++ b/tests/feemarket/go.sum @@ -1057,10 +1057,10 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610 h1:4JlsiRVt/YZOvrKH525T7sZXgEWUEjqSDMwE6fXNbdo= github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610/go.mod h1:kB8gFZX07CyJnw8q9iEZijI3qJTIe1K/Y++P5VGkrcg= -github.com/skip-mev/feemarket v1.0.0 h1:6saDWTgCedMSBur+xLCURtZsxMX/CHmflhA/zuMo+7w= -github.com/skip-mev/feemarket v1.0.0/go.mod h1:52iSehc6mb98xPhRYRqg4crAIxz32RWTbK/LXOwRuf4= -github.com/skip-mev/feemarket/tests/e2e v1.6.0 h1:kGf32G/2vvLUBDYxjUHCR7+WSE97AjNGMbU4xNuQj7M= -github.com/skip-mev/feemarket/tests/e2e v1.6.0/go.mod h1:0OGXj14idjYg9jOzydF3fbYXBARDqTGY8MADvFxnU5A= +github.com/skip-mev/feemarket v1.0.1 h1:Bkn7ELhaqYppki1c9eWQw3fEYsGXXeHng9VxD4AdMBY= +github.com/skip-mev/feemarket v1.0.1/go.mod h1:52iSehc6mb98xPhRYRqg4crAIxz32RWTbK/LXOwRuf4= +github.com/skip-mev/feemarket/tests/e2e v1.10.0 h1:oKAZSo+rynd2b7+T8/U+4C+h//rrTdjLICG2Awjk8YA= +github.com/skip-mev/feemarket/tests/e2e v1.10.0/go.mod h1:57BURopGhr+L0zDkhj1E9jzP9W8rMzRb3b+MT+trlB4= github.com/skip-mev/interchaintest/v8 v8.0.1-0.20240611183342-72ec508eb966 h1:X5BD7m4QieHlORqGho1Af8r0O1GSWBRYO330xyu2kzQ= github.com/skip-mev/interchaintest/v8 v8.0.1-0.20240611183342-72ec508eb966/go.mod h1:nfPgRi1yjnzi+qF+0Fs9qN9kkS1Fk0oqgpKvqg5a200= github.com/skip-mev/slinky v1.0.0 h1:4sgHF1H8yrqNn3Uhuw+B11aWIavXgaSiZBZU5/BF/fs= From 75cc4c9cda87a854d93a072401fae959c8a1216c Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Wed, 12 Jun 2024 18:33:43 +0300 Subject: [PATCH 11/87] fix nil consensus param --- app/upgrades/v4.0.0/upgrades.go | 5 +++++ app/upgrades/v4.0.0/upgrades_test.go | 7 ------- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/app/upgrades/v4.0.0/upgrades.go b/app/upgrades/v4.0.0/upgrades.go index caf023e85..613ce7213 100644 --- a/app/upgrades/v4.0.0/upgrades.go +++ b/app/upgrades/v4.0.0/upgrades.go @@ -232,6 +232,11 @@ func enableVoteExtensions(ctx sdk.Context, consensusKeeper *consensuskeeper.Keep return err } + oldParams.Params.Version = &comettypes.VersionParams{App: 0} + if err := consensusKeeper.ParamsStore.Set(ctx, *oldParams.Params); err != nil { + return err + } + // we need to enable VoteExtensions for Slinky oldParams.Params.Abci = &comettypes.ABCIParams{VoteExtensionsEnableHeight: ctx.BlockHeight() + 4} diff --git a/app/upgrades/v4.0.0/upgrades_test.go b/app/upgrades/v4.0.0/upgrades_test.go index 099aca379..e38f91b9c 100644 --- a/app/upgrades/v4.0.0/upgrades_test.go +++ b/app/upgrades/v4.0.0/upgrades_test.go @@ -133,13 +133,6 @@ func (suite *UpgradeTestSuite) TestDynamicFeesUpgrade() { ctx := suite.ChainA.GetContext() t := suite.T() - oldParams, err := app.ConsensusParamsKeeper.Params(ctx, &types.QueryParamsRequest{}) - suite.Require().NoError(err) - // it is automatically tracked in upgrade handler, we need to set it manually for tests - oldParams.Params.Version = &comettypes.VersionParams{App: 0} - // we need to properly set consensus params for tests or we get a panic - suite.Require().NoError(app.ConsensusParamsKeeper.ParamsStore.Set(ctx, *oldParams.Params)) - upgrade := upgradetypes.Plan{ Name: v400.UpgradeName, Info: "some text here", From 7954d7a7afbc66aa78935ee0ed4938af92308fdf Mon Sep 17 00:00:00 2001 From: keylogic1 <119584546+keylogic1@users.noreply.github.com> Date: Thu, 13 Jun 2024 19:33:12 +0300 Subject: [PATCH 12/87] Add CI for container image --- .github/workflows/ci.yml | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..06853e1dd --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,34 @@ +name: ci + +on: + push: + branches: + - "main" + +jobs: + docker: + runs-on: self-hosted + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Log in to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + with: + version: "lab:latest" + driver: cloud + endpoint: "neutronorg/neutron" + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: . + file: Dockerfile.builder + tags: "neutronorg/neutron:latest" + # For pull requests, export results to the build cache. + # Otherwise, push to a registry. + outputs: ${{ github.event_name == 'pull_request' && 'type=cacheonly' || 'type=registry,push=true' }} + From ab23ace3f4b37d98f8c81ba99b2ca70344314da2 Mon Sep 17 00:00:00 2001 From: keylogic1 <119584546+keylogic1@users.noreply.github.com> Date: Thu, 13 Jun 2024 19:35:41 +0300 Subject: [PATCH 13/87] Update workers --- .github/workflows/ci.yml | 2 +- .github/workflows/lint.yml | 2 +- .github/workflows/pr.yml | 4 ++-- .github/workflows/push.yml | 2 +- .github/workflows/test_trigger.yml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 06853e1dd..b012f58ed 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,7 +7,7 @@ on: jobs: docker: - runs-on: self-hosted + runs-on: [self-hosted, ubuntu-latest] steps: - name: Checkout uses: actions/checkout@v4 diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 0560f62e9..adc0938b4 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -14,7 +14,7 @@ permissions: jobs: golangci: name: lint - runs-on: ubuntu-latest + runs-on: [self-hosted, ubuntu-latest] steps: - uses: actions/setup-go@v4 with: diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 6d9db1f17..d81f1bf33 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -13,7 +13,7 @@ jobs: # This job only runs for pull request comments name: PR comment if: ${{ github.event.issue.pull_request }} - runs-on: ubuntu-latest + runs-on: [self-hosted, ubuntu-latest] steps: - name: Send Notification uses: appleboy/telegram-action@master @@ -26,7 +26,7 @@ jobs: pull_requests_and_review: name: Pull request action or review if: ${{ !github.event.issue.pull_request }} - runs-on: ubuntu-latest + runs-on: [self-hosted, ubuntu-latest] steps: - name: Send Notification uses: appleboy/telegram-action@master diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 4fa60b7e6..9b1fb5751 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -5,7 +5,7 @@ on: [push, pull_request] jobs: tests: name: Test - runs-on: ubuntu-latest + runs-on: [self-hosted, ubuntu-latest] steps: - name: Set up Go 1.22 uses: actions/setup-go@v4 diff --git a/.github/workflows/test_trigger.yml b/.github/workflows/test_trigger.yml index f58802c71..470981bf6 100644 --- a/.github/workflows/test_trigger.yml +++ b/.github/workflows/test_trigger.yml @@ -14,7 +14,7 @@ on: jobs: dispatch: name: Dispatch Tests Workflow - runs-on: ubuntu-latest + runs-on: [self-hosted, ubuntu-latest] steps: - name: Evaluate PR Merged Status and Labels run: | From 2b5bcf5079c40a0404c24d82fbf3a398c56b6a26 Mon Sep 17 00:00:00 2001 From: keylogic1 <119584546+keylogic1@users.noreply.github.com> Date: Thu, 13 Jun 2024 20:01:58 +0300 Subject: [PATCH 14/87] Update CI Workflow --- .github/workflows/ci.yml | 60 +++++++++++++++++++----------- .github/workflows/lint.yml | 2 +- .github/workflows/pr.yml | 4 +- .github/workflows/push.yml | 2 +- .github/workflows/test_trigger.yml | 2 +- 5 files changed, 44 insertions(+), 26 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b012f58ed..fc7bade9f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,34 +1,52 @@ -name: ci +name: CI on: push: branches: - "main" + pull_request: + branches: + - "main" jobs: docker: - runs-on: [self-hosted, ubuntu-latest] + runs-on: self-hosted + steps: - name: Checkout uses: actions/checkout@v4 - - name: Log in to Docker Hub - uses: docker/login-action@v3 with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} + fetch-depth: 0 + + - name: Install dependencies + run: sudo apt-get update && sudo apt-get install -y jq curl git + + - name: Download Buildx with Hydrobuilder support + run: | + ARCH=amd64 + BUILDX_URL=$(curl -s https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/buildx-lab-releases.json | jq -r ".latest.assets[] | select(endswith(\"linux-$ARCH\"))") + mkdir -vp ~/.docker/cli-plugins/ + curl --silent -L --output ~/.docker/cli-plugins/docker-buildx $BUILDX_URL + chmod a+x ~/.docker/cli-plugins/docker-buildx + + - name: Get version from git tags + id: get_version + run: echo "VERSION=$(git describe --tags --abbrev=0 | sed 's/^v//')" >> $GITHUB_ENV + + - name: Log in to Docker Hub + run: echo "${{ secrets.DOCKERHUB_TOKEN }}" | docker login --username ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin + - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - with: - version: "lab:latest" - driver: cloud - endpoint: "neutronorg/neutron" - - name: Build and push - uses: docker/build-push-action@v5 - with: - context: . - file: Dockerfile.builder - tags: "neutronorg/neutron:latest" - # For pull requests, export results to the build cache. - # Otherwise, push to a registry. - outputs: ${{ github.event_name == 'pull_request' && 'type=cacheonly' || 'type=registry,push=true' }} - + run: docker buildx create --use --driver cloud "neutronorg/default" + + - name: Build and push Docker image + env: + VERSION: ${{ env.VERSION }} + run: | + DOCKER_BUILDKIT=1 make build-static-linux-amd64 + docker tag neutron-amd64:latest neutronorg/neutron:${{ env.VERSION }} + docker push neutronorg/neutron:${{ env.VERSION }} + + - name: Cleanup temporary container + run: docker rm -f neutronbinary || true + diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index adc0938b4..8fce320a6 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -14,7 +14,7 @@ permissions: jobs: golangci: name: lint - runs-on: [self-hosted, ubuntu-latest] + runs-on: self-hosted steps: - uses: actions/setup-go@v4 with: diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index d81f1bf33..4904231fc 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -13,7 +13,7 @@ jobs: # This job only runs for pull request comments name: PR comment if: ${{ github.event.issue.pull_request }} - runs-on: [self-hosted, ubuntu-latest] + runs-on: self-hosted steps: - name: Send Notification uses: appleboy/telegram-action@master @@ -26,7 +26,7 @@ jobs: pull_requests_and_review: name: Pull request action or review if: ${{ !github.event.issue.pull_request }} - runs-on: [self-hosted, ubuntu-latest] + runs-on: self-hosted steps: - name: Send Notification uses: appleboy/telegram-action@master diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 9b1fb5751..3bf73312b 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -5,7 +5,7 @@ on: [push, pull_request] jobs: tests: name: Test - runs-on: [self-hosted, ubuntu-latest] + runs-on: self-hosted steps: - name: Set up Go 1.22 uses: actions/setup-go@v4 diff --git a/.github/workflows/test_trigger.yml b/.github/workflows/test_trigger.yml index 470981bf6..6b2102ae8 100644 --- a/.github/workflows/test_trigger.yml +++ b/.github/workflows/test_trigger.yml @@ -14,7 +14,7 @@ on: jobs: dispatch: name: Dispatch Tests Workflow - runs-on: [self-hosted, ubuntu-latest] + runs-on: self-hosted steps: - name: Evaluate PR Merged Status and Labels run: | From 277a1f9802d5af4b6bd516764ee03cd2592e9d96 Mon Sep 17 00:00:00 2001 From: keylogic1 <119584546+keylogic1@users.noreply.github.com> Date: Thu, 13 Jun 2024 20:04:44 +0300 Subject: [PATCH 15/87] Fix Org name --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fc7bade9f..84c34b10a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -37,7 +37,7 @@ jobs: run: echo "${{ secrets.DOCKERHUB_TOKEN }}" | docker login --username ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin - name: Set up Docker Buildx - run: docker buildx create --use --driver cloud "neutronorg/default" + run: docker buildx create --use --driver cloud "neutronorg/neutron" - name: Build and push Docker image env: From 918a46641e078d4b7706c5ef1cfd69dea581e8e8 Mon Sep 17 00:00:00 2001 From: keylogic1 <119584546+keylogic1@users.noreply.github.com> Date: Thu, 13 Jun 2024 20:08:56 +0300 Subject: [PATCH 16/87] Add GO to CI Workflow --- .github/workflows/ci.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 84c34b10a..3e2ce1679 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,6 +21,15 @@ jobs: - name: Install dependencies run: sudo apt-get update && sudo apt-get install -y jq curl git + - name: Install Go + run: | + GO_VERSION=1.22 + curl -LO https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz + sudo tar -C /usr/local -xzf go${GO_VERSION}.linux-amd64.tar.gz + echo "export PATH=$PATH:/usr/local/go/bin" >> $HOME/.profile + source $HOME/.profile + shell: bash + - name: Download Buildx with Hydrobuilder support run: | ARCH=amd64 From 5995fd49c4d7c9e4be8ed25a63b665cfdc2fb97a Mon Sep 17 00:00:00 2001 From: keylogic1 <119584546+keylogic1@users.noreply.github.com> Date: Thu, 13 Jun 2024 20:13:25 +0300 Subject: [PATCH 17/87] CI: GO version update --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3e2ce1679..6dfa3ef82 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,7 +23,7 @@ jobs: - name: Install Go run: | - GO_VERSION=1.22 + GO_VERSION=1.22.4 curl -LO https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz sudo tar -C /usr/local -xzf go${GO_VERSION}.linux-amd64.tar.gz echo "export PATH=$PATH:/usr/local/go/bin" >> $HOME/.profile From 2a5d1f19543c7015edcf5263fe79caf43ce1e74d Mon Sep 17 00:00:00 2001 From: keylogic1 <119584546+keylogic1@users.noreply.github.com> Date: Thu, 13 Jun 2024 20:22:57 +0300 Subject: [PATCH 18/87] Test global buildkit --- .github/workflows/ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6dfa3ef82..91e5438bd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,13 +4,17 @@ on: push: branches: - "main" + - "chore/fix-ci" pull_request: branches: - "main" + - "chore/fix-ci" jobs: docker: runs-on: self-hosted + env: + DOCKER_BUILDKIT: 1 steps: - name: Checkout From ba302b97a860aa0bc5ed589c08d8cbe1e35af54d Mon Sep 17 00:00:00 2001 From: keylogic1 <119584546+keylogic1@users.noreply.github.com> Date: Thu, 13 Jun 2024 20:28:52 +0300 Subject: [PATCH 19/87] Test II --- .github/workflows/ci.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 91e5438bd..cf6c4a889 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -50,7 +50,12 @@ jobs: run: echo "${{ secrets.DOCKERHUB_TOKEN }}" | docker login --username ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin - name: Set up Docker Buildx - run: docker buildx create --use --driver cloud "neutronorg/neutron" + uses: docker/setup-buildx-action@v3 + with: + version: "lab:latest" + driver: cloud + endpoint: "neutronorg/neutron" + install: true - name: Build and push Docker image env: From a072b6c82517e8efe321bdc3f0a5b6a8b08a0233 Mon Sep 17 00:00:00 2001 From: keylogic1 <119584546+keylogic1@users.noreply.github.com> Date: Thu, 13 Jun 2024 20:38:00 +0300 Subject: [PATCH 20/87] Test III --- .github/workflows/ci.yml | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cf6c4a889..8898b9082 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -44,7 +44,7 @@ jobs: - name: Get version from git tags id: get_version - run: echo "VERSION=$(git describe --tags --abbrev=0 | sed 's/^v//')" >> $GITHUB_ENV + run: echo "VERSION=v$(git describe --tags --abbrev=0 | sed 's/^v//')" >> $GITHUB_ENV - name: Log in to Docker Hub run: echo "${{ secrets.DOCKERHUB_TOKEN }}" | docker login --username ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin @@ -57,13 +57,23 @@ jobs: endpoint: "neutronorg/neutron" install: true - - name: Build and push Docker image - env: - VERSION: ${{ env.VERSION }} - run: | - DOCKER_BUILDKIT=1 make build-static-linux-amd64 - docker tag neutron-amd64:latest neutronorg/neutron:${{ env.VERSION }} - docker push neutronorg/neutron:${{ env.VERSION }} + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: . + file: Dockerfile.builder + tags: "${{ env.VERSION }}" + # For pull requests, export results to the build cache. + # Otherwise, push to a registry. + outputs: ${{ github.event_name == 'pull_request' && 'type=cacheonly' || 'type=registry,push=true' }} + +# - name: Build and push Docker image +# env: +# VERSION: ${{ env.VERSION }} +# run: | +# DOCKER_BUILDKIT=1 make build-static-linux-amd64 +# docker tag neutron-amd64:latest neutronorg/neutron:${{ env.VERSION }} +# docker push neutronorg/neutron:${{ env.VERSION }} - name: Cleanup temporary container run: docker rm -f neutronbinary || true From 09442e7a842629e42be87d13765f09d5a3fbcfe6 Mon Sep 17 00:00:00 2001 From: keylogic1 <119584546+keylogic1@users.noreply.github.com> Date: Thu, 13 Jun 2024 20:42:40 +0300 Subject: [PATCH 21/87] Test IV --- .github/workflows/ci.yml | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8898b9082..b5ffa9d8a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -57,23 +57,24 @@ jobs: endpoint: "neutronorg/neutron" install: true - - name: Build and push - uses: docker/build-push-action@v5 - with: - context: . - file: Dockerfile.builder - tags: "${{ env.VERSION }}" - # For pull requests, export results to the build cache. - # Otherwise, push to a registry. - outputs: ${{ github.event_name == 'pull_request' && 'type=cacheonly' || 'type=registry,push=true' }} +# - name: Build and push +# uses: docker/build-push-action@v5 +# with: +# context: . +# file: Dockerfile.builder +# tags: "${{ env.VERSION }}" +# # For pull requests, export results to the build cache. +# # Otherwise, push to a registry. +# outputs: ${{ github.event_name == 'pull_request' && 'type=cacheonly' || 'type=registry,push=true' }} -# - name: Build and push Docker image -# env: -# VERSION: ${{ env.VERSION }} -# run: | -# DOCKER_BUILDKIT=1 make build-static-linux-amd64 -# docker tag neutron-amd64:latest neutronorg/neutron:${{ env.VERSION }} -# docker push neutronorg/neutron:${{ env.VERSION }} + - name: Build and push Docker image + env: + VERSION: ${{ env.VERSION }} + run: | + docker buildx use neutronorg/neutron + make build-static-linux-amd64 + docker tag neutron-amd64:latest neutronorg/neutron:${{ env.VERSION }} + docker push neutronorg/neutron:${{ env.VERSION }} - name: Cleanup temporary container run: docker rm -f neutronbinary || true From 29f5ed243e4b209fff01cb8cab81fdc26274253a Mon Sep 17 00:00:00 2001 From: keylogic1 <119584546+keylogic1@users.noreply.github.com> Date: Thu, 13 Jun 2024 20:45:19 +0300 Subject: [PATCH 22/87] Test V --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b5ffa9d8a..50e163d19 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -71,7 +71,7 @@ jobs: env: VERSION: ${{ env.VERSION }} run: | - docker buildx use neutronorg/neutron + docker buildx use neutron make build-static-linux-amd64 docker tag neutron-amd64:latest neutronorg/neutron:${{ env.VERSION }} docker push neutronorg/neutron:${{ env.VERSION }} From 21c127089bacccd06a0d1343a7a7ee9e64ee4f94 Mon Sep 17 00:00:00 2001 From: keylogic1 <119584546+keylogic1@users.noreply.github.com> Date: Thu, 13 Jun 2024 20:49:34 +0300 Subject: [PATCH 23/87] Test VI --- .github/workflows/ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 50e163d19..041d09da4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -50,6 +50,7 @@ jobs: run: echo "${{ secrets.DOCKERHUB_TOKEN }}" | docker login --username ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin - name: Set up Docker Buildx + id: buildx uses: docker/setup-buildx-action@v3 with: version: "lab:latest" @@ -70,8 +71,9 @@ jobs: - name: Build and push Docker image env: VERSION: ${{ env.VERSION }} + BUILDER: ${{ steps.buildx.outputs.name }} run: | - docker buildx use neutron + docker buildx use $BUILDER make build-static-linux-amd64 docker tag neutron-amd64:latest neutronorg/neutron:${{ env.VERSION }} docker push neutronorg/neutron:${{ env.VERSION }} From 3c9eba37c8f3e2d28786a05295cbce329ea0745c Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Wed, 12 Jun 2024 12:28:45 +0300 Subject: [PATCH 24/87] bump slinky to v1.0.1-rc1 --- go.mod | 14 +++++++---- go.sum | 33 +++++++++++++++++-------- tests/slinky/go.mod | 10 ++++---- tests/slinky/go.sum | 20 +++++++-------- tests/slinky/slinky_integration_test.go | 2 +- 5 files changed, 48 insertions(+), 31 deletions(-) diff --git a/go.mod b/go.mod index eace518d5..2ab400981 100644 --- a/go.mod +++ b/go.mod @@ -39,7 +39,7 @@ require ( github.com/rs/zerolog v1.32.0 github.com/skip-mev/block-sdk/v2 v2.1.2 github.com/skip-mev/feemarket v1.0.0 - github.com/skip-mev/slinky v1.0.0 + github.com/skip-mev/slinky v1.0.1-rc github.com/spf13/cast v1.6.0 github.com/spf13/cobra v1.8.0 github.com/spf13/pflag v1.0.5 @@ -48,7 +48,7 @@ require ( golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 google.golang.org/genproto/googleapis/api v0.0.0-20240610135401-a8a62080eff3 google.golang.org/grpc v1.64.0 - google.golang.org/protobuf v1.34.1 + google.golang.org/protobuf v1.34.2 gopkg.in/yaml.v2 v2.4.0 ) @@ -62,7 +62,7 @@ require ( github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/ethereum/c-kzg-4844 v1.0.0 // indirect - github.com/ethereum/go-ethereum v1.14.4 // indirect + github.com/ethereum/go-ethereum v1.14.5 // indirect github.com/gagliardetto/binary v0.8.0 // indirect github.com/gagliardetto/solana-go v1.10.0 // indirect github.com/gagliardetto/treeout v0.1.4 // indirect @@ -104,6 +104,7 @@ require ( github.com/99designs/keyring v1.2.2 // indirect github.com/DataDog/datadog-go v3.2.0+incompatible // indirect github.com/DataDog/zstd v1.5.5 // indirect + github.com/GeertJohan/go.rice v1.0.3 // indirect github.com/aws/aws-sdk-go v1.44.224 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect @@ -111,6 +112,7 @@ require ( github.com/bits-and-blooms/bitset v1.13.0 // indirect github.com/btcsuite/btcd v0.22.0-beta // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect + github.com/buger/jsonparser v1.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.3.0 // indirect @@ -127,6 +129,7 @@ require ( github.com/cosmos/gogogateway v1.2.0 // indirect github.com/cosmos/iavl v1.2.0 // indirect github.com/cosmos/ledger-cosmos-go v0.13.3 // indirect + github.com/daaku/go.zipexe v1.0.2 // indirect github.com/danieljoos/wincred v1.2.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect @@ -162,7 +165,8 @@ require ( github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect github.com/googleapis/gax-go/v2 v2.12.4 // indirect github.com/gorilla/handlers v1.5.2 // indirect - github.com/gorilla/websocket v1.5.1 // indirect + github.com/gorilla/rpc v1.2.0 // indirect + github.com/gorilla/websocket v1.5.2 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect @@ -182,7 +186,7 @@ require ( github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jmhodges/levigo v1.0.0 // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/compress v1.17.9 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/lib/pq v1.10.9 // indirect diff --git a/go.sum b/go.sum index 971506c0f..98d4bb3d4 100644 --- a/go.sum +++ b/go.sum @@ -233,6 +233,9 @@ github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dX github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= +github.com/GeertJohan/go.rice v1.0.3 h1:k5viR+xGtIhF61125vCE1cmJ5957RQGXG6dmbaWZSmI= +github.com/GeertJohan/go.rice v1.0.3/go.mod h1:XVdrU4pW00M4ikZed5q56tPf1v2KwnIKeIdc9CBYNt4= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= @@ -252,6 +255,7 @@ github.com/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= 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/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= 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= @@ -306,6 +310,8 @@ github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtE github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/bufbuild/protocompile v0.6.0 h1:Uu7WiSQ6Yj9DbkdnOe7U4mNKp58y9WDMKDn28/ZlunY= github.com/bufbuild/protocompile v0.6.0/go.mod h1:YNP35qEYoYGme7QMtz5SBCoN4kL4g12jTtjuzRNdjpE= +github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= +github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= 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= @@ -415,6 +421,8 @@ github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDF github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= 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/daaku/go.zipexe v1.0.2 h1:Zg55YLYTr7M9wjKn8SY/WcpuuEi+kR2u4E8RhvpyXmk= +github.com/daaku/go.zipexe v1.0.2/go.mod h1:5xWogtqlYnfBXkSB1o9xysukNP9GTvaNkqzUZbt3Bw8= github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -471,8 +479,8 @@ github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go. github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.14.4 h1:AI1778nnI9vb3eCcLo6XTw/lqp6ilVHQmbWmJOUHGU8= -github.com/ethereum/go-ethereum v1.14.4/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= +github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= +github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= @@ -698,10 +706,12 @@ github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2z github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/gorilla/rpc v1.2.0 h1:WvvdC2lNeT1SP32zrIce5l0ECBfbAlmrmSBsuc57wfk= +github.com/gorilla/rpc v1.2.0/go.mod h1:V4h9r+4sF5HnzqbwIez0fKSpANP0zlYd3qR7p36jkTQ= 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.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= -github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= +github.com/gorilla/websocket v1.5.2 h1:qoW6V1GT3aZxybsbC6oLnailWnB+qTMVwMreOso9XUw= +github.com/gorilla/websocket v1.5.2/go.mod h1:0n9H61RBAcf5/38py2MCYbxzPIY9rOkpvvMT24Rqs30= 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.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= @@ -828,8 +838,8 @@ github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYs github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= 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/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= @@ -935,6 +945,7 @@ github.com/neutron-org/cosmos-sdk v0.50.7-neutron/go.mod h1:84xDDJEHttRT7NDGwBaU github.com/neutron-org/wasmd v0.51.0 h1:OBp5aG8xeEz199Crepwb3q6YtuJVL0sudsD7F2oyyfs= github.com/neutron-org/wasmd v0.51.0/go.mod h1:7TSaj5HoolghujuVWeExqmcUKgpcYWEySGLSODbnnwY= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nkovacs/streamquote v1.0.0/go.mod h1:BN+NaZ2CmdKqUuTUXUEm9j95B2TRbpOWpxbJYzzgUsc= 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= @@ -1080,8 +1091,8 @@ github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610 h1:4JlsiRVt github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610/go.mod h1:kB8gFZX07CyJnw8q9iEZijI3qJTIe1K/Y++P5VGkrcg= github.com/skip-mev/feemarket v1.0.0 h1:6saDWTgCedMSBur+xLCURtZsxMX/CHmflhA/zuMo+7w= github.com/skip-mev/feemarket v1.0.0/go.mod h1:52iSehc6mb98xPhRYRqg4crAIxz32RWTbK/LXOwRuf4= -github.com/skip-mev/slinky v1.0.0 h1:4sgHF1H8yrqNn3Uhuw+B11aWIavXgaSiZBZU5/BF/fs= -github.com/skip-mev/slinky v1.0.0/go.mod h1:XRNy7m51XOLtEWN5l3TyKyYkNUL7KL2tuTsYe17LYGE= +github.com/skip-mev/slinky v1.0.1-rc h1:DB2gwc20AbfcnZhfhHg7cT2rsc8FhkUbvC6NVmWt7oQ= +github.com/skip-mev/slinky v1.0.1-rc/go.mod h1:DvvvuNshfoEjDRMs6qgbSJu/cV+g1I9z7lAXzt77WHE= 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= @@ -1172,6 +1183,8 @@ github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= +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/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= @@ -1840,8 +1853,8 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= 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= diff --git a/tests/slinky/go.mod b/tests/slinky/go.mod index be329d72c..2415f5b11 100644 --- a/tests/slinky/go.mod +++ b/tests/slinky/go.mod @@ -14,8 +14,8 @@ replace ( require ( github.com/cosmos/cosmos-sdk v0.50.7 - github.com/skip-mev/slinky v1.0.0 - github.com/skip-mev/slinky/tests/integration v1.0.1-0.20240607150233-d58cd667a373 + github.com/skip-mev/slinky v1.0.1-rc + github.com/skip-mev/slinky/tests/integration v1.1.1-0.20240614013955-8d008bc600dd github.com/strangelove-ventures/interchaintest/v8 v8.4.0 github.com/stretchr/testify v1.9.0 ) @@ -127,7 +127,7 @@ require ( github.com/googleapis/gax-go/v2 v2.12.4 // indirect github.com/gorilla/handlers v1.5.2 // indirect github.com/gorilla/mux v1.8.1 // indirect - github.com/gorilla/websocket v1.5.1 // indirect + github.com/gorilla/websocket v1.5.2 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect @@ -155,7 +155,7 @@ require ( github.com/ipfs/go-cid v0.4.1 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jmhodges/levigo v1.0.0 // indirect - github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/compress v1.17.9 // indirect github.com/klauspost/cpuid/v2 v2.2.7 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect @@ -248,7 +248,7 @@ require ( google.golang.org/genproto/googleapis/api v0.0.0-20240604185151-ef581f913117 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 // indirect google.golang.org/grpc v1.64.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + google.golang.org/protobuf v1.34.2 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/tests/slinky/go.sum b/tests/slinky/go.sum index f7029dc02..75d1acbe6 100644 --- a/tests/slinky/go.sum +++ b/tests/slinky/go.sum @@ -668,8 +668,8 @@ github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= 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.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= -github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= +github.com/gorilla/websocket v1.5.2 h1:qoW6V1GT3aZxybsbC6oLnailWnB+qTMVwMreOso9XUw= +github.com/gorilla/websocket v1.5.2/go.mod h1:0n9H61RBAcf5/38py2MCYbxzPIY9rOkpvvMT24Rqs30= 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.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= @@ -788,8 +788,8 @@ github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6 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.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -1044,10 +1044,10 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/skip-mev/chaintestutil v0.0.0-20240116134208-3e49bf514803 h1:VRRVYN3wsOIOqVT3e3nDh3vyUl6RvF9QwdK4BvgPP9c= github.com/skip-mev/chaintestutil v0.0.0-20240116134208-3e49bf514803/go.mod h1:LF2koCTmygQnz11yjSfHvNP8axdyZ2lTEw0EwI+dnno= -github.com/skip-mev/slinky v1.0.0 h1:4sgHF1H8yrqNn3Uhuw+B11aWIavXgaSiZBZU5/BF/fs= -github.com/skip-mev/slinky v1.0.0/go.mod h1:XRNy7m51XOLtEWN5l3TyKyYkNUL7KL2tuTsYe17LYGE= -github.com/skip-mev/slinky/tests/integration v1.0.1-0.20240607150233-d58cd667a373 h1:OAxFPLsoLVRTyvd8zk26gZHy12qBRLVe8WXC5L5QcTQ= -github.com/skip-mev/slinky/tests/integration v1.0.1-0.20240607150233-d58cd667a373/go.mod h1:MQtr5sHRG9O8Ytl7Anlqs01Cm+DtgP13p+TOn7KPjGo= +github.com/skip-mev/slinky v1.0.1-rc h1:DB2gwc20AbfcnZhfhHg7cT2rsc8FhkUbvC6NVmWt7oQ= +github.com/skip-mev/slinky v1.0.1-rc/go.mod h1:DvvvuNshfoEjDRMs6qgbSJu/cV+g1I9z7lAXzt77WHE= +github.com/skip-mev/slinky/tests/integration v1.1.1-0.20240614013955-8d008bc600dd h1:jqem8fOGfvzykGaAMe8daZh+SU+5GMBNaJJXOHpx/Wc= +github.com/skip-mev/slinky/tests/integration v1.1.1-0.20240614013955-8d008bc600dd/go.mod h1:N78g29Sbbr8MdUm/wVx0B9kALvDLaF9Bn2fYIAUL7sI= 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= @@ -1764,8 +1764,8 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= 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= diff --git a/tests/slinky/slinky_integration_test.go b/tests/slinky/slinky_integration_test.go index 39ab47d1d..c5679411b 100644 --- a/tests/slinky/slinky_integration_test.go +++ b/tests/slinky/slinky_integration_test.go @@ -39,7 +39,7 @@ var ( oracleImage = ibc.DockerImage{ Repository: "ghcr.io/skip-mev/slinky-sidecar", - Version: "v1.0.0", + Version: "v1.0.1-rc", UidGid: "1000:1000", } encodingConfig = testutil.MakeTestEncodingConfig( From 21409efa6154a3c1bf544eb57da54ab2ce40fd7a Mon Sep 17 00:00:00 2001 From: swelf Date: Fri, 14 Jun 2024 14:43:36 +0300 Subject: [PATCH 25/87] fixed slinky e2e tests --- Makefile | 2 +- tests/slinky/slinky_integration_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index c3994bde8..4902c1c8b 100644 --- a/Makefile +++ b/Makefile @@ -136,7 +136,7 @@ build-slinky-e2e-docker-image: go.sum $(BUILDDIR)/ -f Dockerfile.builder . slinky-e2e-test: - cd ./tests/slinky && go mod tidy && go test -v -race -timeout 20m -count=1 ./... + cd ./tests/slinky && go mod tidy && go test -v -race -timeout 40m -count=1 ./... install-test-binary: check_version go.sum go install -mod=readonly $(BUILD_FLAGS_TEST_BINARY) ./cmd/neutrond diff --git a/tests/slinky/slinky_integration_test.go b/tests/slinky/slinky_integration_test.go index c5679411b..39ab47d1d 100644 --- a/tests/slinky/slinky_integration_test.go +++ b/tests/slinky/slinky_integration_test.go @@ -39,7 +39,7 @@ var ( oracleImage = ibc.DockerImage{ Repository: "ghcr.io/skip-mev/slinky-sidecar", - Version: "v1.0.1-rc", + Version: "v1.0.0", UidGid: "1000:1000", } encodingConfig = testutil.MakeTestEncodingConfig( From 0da01d17cdae69aa38320e679418c929a342d2f8 Mon Sep 17 00:00:00 2001 From: Andrei Zavgorodnii Date: Thu, 13 Jun 2024 16:35:43 +0100 Subject: [PATCH 26/87] fix: add tf checks & tests --- x/tokenfactory/keeper/bankactions.go | 55 ++++++++++++++++------------ x/tokenfactory/keeper/keeper.go | 40 ++++++++++---------- x/tokenfactory/keeper/keeper_test.go | 40 +++++++++++++++++++- x/tokenfactory/types/msgs.go | 7 ++-- 4 files changed, 94 insertions(+), 48 deletions(-) diff --git a/x/tokenfactory/keeper/bankactions.go b/x/tokenfactory/keeper/bankactions.go index 3438f29a2..e4627d9e0 100644 --- a/x/tokenfactory/keeper/bankactions.go +++ b/x/tokenfactory/keeper/bankactions.go @@ -1,8 +1,6 @@ package keeper import ( - "sort" - sdk "github.com/cosmos/cosmos-sdk/types" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -17,12 +15,16 @@ func (k Keeper) mintTo(ctx sdk.Context, amount sdk.Coin, mintTo string) error { return err } - err = k.bankKeeper.MintCoins(ctx, types.ModuleName, sdk.NewCoins(amount)) + addr, err := sdk.AccAddressFromBech32(mintTo) if err != nil { return err } - addr, err := sdk.AccAddressFromBech32(mintTo) + if k.isModuleAccount(ctx, addr) { + return status.Errorf(codes.Internal, "minting to module accounts is forbidden") + } + + err = k.bankKeeper.MintCoins(ctx, types.ModuleName, sdk.NewCoins(amount)) if err != nil { return err } @@ -44,6 +46,10 @@ func (k Keeper) burnFrom(ctx sdk.Context, amount sdk.Coin, burnFrom string) erro return err } + if k.isModuleAccount(ctx, addr) { + return status.Errorf(codes.Internal, "burning from module accounts is forbidden") + } + err = k.bankKeeper.SendCoinsFromAccountToModule(ctx, addr, types.ModuleName, @@ -62,37 +68,38 @@ func (k Keeper) forceTransfer(ctx sdk.Context, amount sdk.Coin, fromAddr, toAddr return err } - fromAcc, err := sdk.AccAddressFromBech32(fromAddr) + fromSdkAddr, err := sdk.AccAddressFromBech32(fromAddr) + if err != nil { + return err + } + + toSdkAddr, err := sdk.AccAddressFromBech32(toAddr) if err != nil { return err } - sortedPermAddrs := make([]string, 0, len(k.permAddrs)) - for moduleName := range k.permAddrs { - sortedPermAddrs = append(sortedPermAddrs, moduleName) + if k.isModuleAccount(ctx, fromSdkAddr) { + return status.Errorf(codes.Internal, "force transfer from module acc not available") } - sort.Strings(sortedPermAddrs) - for _, moduleName := range sortedPermAddrs { + if k.isModuleAccount(ctx, toSdkAddr) { + return status.Errorf(codes.Internal, "force transfer to module acc not available") + } + + return k.bankKeeper.SendCoins(ctx, fromSdkAddr, toSdkAddr, sdk.NewCoins(amount)) +} + +func (k Keeper) isModuleAccount(ctx sdk.Context, addr sdk.AccAddress) bool { + for _, moduleName := range k.knownModuleAddresses { account := k.accountKeeper.GetModuleAccount(ctx, moduleName) if account == nil { - return status.Errorf(codes.NotFound, "account %s not found", moduleName) + return false } - if account.GetAddress().Equals(fromAcc) { - return status.Errorf(codes.Internal, "send from module acc not available") + if account.GetAddress().Equals(addr) { + return true } } - fromSdkAddr, err := sdk.AccAddressFromBech32(fromAddr) - if err != nil { - return err - } - - toSdkAddr, err := sdk.AccAddressFromBech32(toAddr) - if err != nil { - return err - } - - return k.bankKeeper.SendCoins(ctx, fromSdkAddr, toSdkAddr, sdk.NewCoins(amount)) + return false } diff --git a/x/tokenfactory/keeper/keeper.go b/x/tokenfactory/keeper/keeper.go index d4d95f743..0e25e8770 100644 --- a/x/tokenfactory/keeper/keeper.go +++ b/x/tokenfactory/keeper/keeper.go @@ -3,13 +3,12 @@ package keeper import ( "context" "fmt" + "sort" "cosmossdk.io/log" - "github.com/cosmos/cosmos-sdk/codec" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "cosmossdk.io/store/prefix" storetypes "cosmossdk.io/store/types" + "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/neutron-org/neutron/v4/x/tokenfactory/types" @@ -17,13 +16,13 @@ import ( type ( Keeper struct { - storeKey storetypes.StoreKey - permAddrs map[string]authtypes.PermissionsForAddress - cdc codec.Codec - accountKeeper types.AccountKeeper - bankKeeper types.BankKeeper - contractKeeper types.ContractKeeper - authority string + storeKey storetypes.StoreKey + knownModuleAddresses []string + cdc codec.Codec + accountKeeper types.AccountKeeper + bankKeeper types.BankKeeper + contractKeeper types.ContractKeeper + authority string } ) @@ -37,19 +36,20 @@ func NewKeeper( contractKeeper types.ContractKeeper, authority string, ) Keeper { - permAddrs := make(map[string]authtypes.PermissionsForAddress) - for name, perms := range maccPerms { - permAddrs[name] = authtypes.NewPermissionsForAddress(name, perms) + sortedKnownModuleAddresses := make([]string, 0, len(maccPerms)) + for moduleName := range maccPerms { + sortedKnownModuleAddresses = append(sortedKnownModuleAddresses, moduleName) } + sort.Strings(sortedKnownModuleAddresses) return Keeper{ - cdc: cdc, - storeKey: storeKey, - permAddrs: permAddrs, - accountKeeper: accountKeeper, - bankKeeper: bankKeeper, - contractKeeper: contractKeeper, - authority: authority, + cdc: cdc, + storeKey: storeKey, + knownModuleAddresses: sortedKnownModuleAddresses, + accountKeeper: accountKeeper, + bankKeeper: bankKeeper, + contractKeeper: contractKeeper, + authority: authority, } } diff --git a/x/tokenfactory/keeper/keeper_test.go b/x/tokenfactory/keeper/keeper_test.go index e86df652c..c6fd3772a 100644 --- a/x/tokenfactory/keeper/keeper_test.go +++ b/x/tokenfactory/keeper/keeper_test.go @@ -125,6 +125,44 @@ func (suite *KeeperTestSuite) TestForceTransferMsg() { suite.Require().NoError(err) _, err = suite.msgServer.ForceTransfer(suite.ChainA.GetContext(), types.NewMsgForceTransfer(suite.TestAccs[0].String(), mintAmt, govModAcc.GetAddress().String(), suite.TestAccs[1].String())) - suite.Require().ErrorContains(err, "send from module acc not available") + suite.Require().ErrorContains(err, "force transfer from module acc not available") + }) +} + +func (suite *KeeperTestSuite) TestMintToMsg() { + suite.Setup() + + // Create a denom + suite.CreateDefaultDenom(suite.ChainA.GetContext()) + + suite.Run("test force transfer", func() { + mintAmt := sdktypes.NewInt64Coin(suite.defaultDenom, 10) + + govModAcc := suite.GetNeutronZoneApp(suite.ChainA).AccountKeeper.GetModuleAccount(suite.ChainA.GetContext(), authtypes.FeeCollectorName) + + _, err := suite.msgServer.Mint(suite.ChainA.GetContext(), types.NewMsgMintTo(suite.TestAccs[0].String(), mintAmt, govModAcc.GetAddress().String())) + suite.Require().ErrorContains(err, "minting to module accounts is forbidden") + }) +} + +func (suite *KeeperTestSuite) TestBurnFromMsg() { + suite.Setup() + + // Create a denom + suite.CreateDefaultDenom(suite.ChainA.GetContext()) + + suite.Run("test force transfer", func() { + mintAmt := sdktypes.NewInt64Coin(suite.defaultDenom, 10) + + _, err := suite.msgServer.Mint(sdktypes.WrapSDKContext(suite.ChainA.GetContext()), types.NewMsgMint(suite.TestAccs[0].String(), mintAmt)) + suite.Require().NoError(err) + + govModAcc := suite.GetNeutronZoneApp(suite.ChainA).AccountKeeper.GetModuleAccount(suite.ChainA.GetContext(), authtypes.FeeCollectorName) + + err = suite.GetNeutronZoneApp(suite.ChainA).BankKeeper.SendCoins(suite.ChainA.GetContext(), suite.TestAccs[0], govModAcc.GetAddress(), sdktypes.NewCoins(mintAmt)) + suite.Require().NoError(err) + + _, err = suite.msgServer.Burn(suite.ChainA.GetContext(), types.NewMsgBurnFrom(suite.TestAccs[0].String(), mintAmt, govModAcc.GetAddress().String())) + suite.Require().ErrorContains(err, "burning from module accounts is forbidden") }) } diff --git a/x/tokenfactory/types/msgs.go b/x/tokenfactory/types/msgs.go index 659346a8b..7207f7247 100644 --- a/x/tokenfactory/types/msgs.go +++ b/x/tokenfactory/types/msgs.go @@ -112,10 +112,11 @@ func NewMsgBurn(sender string, amount sdk.Coin) *MsgBurn { } // NewMsgBurn creates a message to burn tokens -func NewMsgBurnFrom(sender string, amount sdk.Coin, _ string) *MsgBurn { +func NewMsgBurnFrom(sender string, amount sdk.Coin, from string) *MsgBurn { return &MsgBurn{ - Sender: sender, - Amount: amount, + Sender: sender, + Amount: amount, + BurnFromAddress: from, } } From 8cbc03369fd6b8be5b0038d9724f68f3aaaae2d9 Mon Sep 17 00:00:00 2001 From: Andrei Zavgorodnii Date: Thu, 13 Jun 2024 17:48:41 +0100 Subject: [PATCH 27/87] renaming --- x/tokenfactory/keeper/bankactions.go | 2 +- x/tokenfactory/keeper/keeper.go | 34 ++++++++++++++-------------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/x/tokenfactory/keeper/bankactions.go b/x/tokenfactory/keeper/bankactions.go index e4627d9e0..284728258 100644 --- a/x/tokenfactory/keeper/bankactions.go +++ b/x/tokenfactory/keeper/bankactions.go @@ -90,7 +90,7 @@ func (k Keeper) forceTransfer(ctx sdk.Context, amount sdk.Coin, fromAddr, toAddr } func (k Keeper) isModuleAccount(ctx sdk.Context, addr sdk.AccAddress) bool { - for _, moduleName := range k.knownModuleAddresses { + for _, moduleName := range k.knownModules { account := k.accountKeeper.GetModuleAccount(ctx, moduleName) if account == nil { return false diff --git a/x/tokenfactory/keeper/keeper.go b/x/tokenfactory/keeper/keeper.go index 0e25e8770..593e977a7 100644 --- a/x/tokenfactory/keeper/keeper.go +++ b/x/tokenfactory/keeper/keeper.go @@ -16,13 +16,13 @@ import ( type ( Keeper struct { - storeKey storetypes.StoreKey - knownModuleAddresses []string - cdc codec.Codec - accountKeeper types.AccountKeeper - bankKeeper types.BankKeeper - contractKeeper types.ContractKeeper - authority string + storeKey storetypes.StoreKey + knownModules []string + cdc codec.Codec + accountKeeper types.AccountKeeper + bankKeeper types.BankKeeper + contractKeeper types.ContractKeeper + authority string } ) @@ -36,20 +36,20 @@ func NewKeeper( contractKeeper types.ContractKeeper, authority string, ) Keeper { - sortedKnownModuleAddresses := make([]string, 0, len(maccPerms)) + sortedKnownModules := make([]string, 0, len(maccPerms)) for moduleName := range maccPerms { - sortedKnownModuleAddresses = append(sortedKnownModuleAddresses, moduleName) + sortedKnownModules = append(sortedKnownModules, moduleName) } - sort.Strings(sortedKnownModuleAddresses) + sort.Strings(sortedKnownModules) return Keeper{ - cdc: cdc, - storeKey: storeKey, - knownModuleAddresses: sortedKnownModuleAddresses, - accountKeeper: accountKeeper, - bankKeeper: bankKeeper, - contractKeeper: contractKeeper, - authority: authority, + cdc: cdc, + storeKey: storeKey, + knownModules: sortedKnownModules, + accountKeeper: accountKeeper, + bankKeeper: bankKeeper, + contractKeeper: contractKeeper, + authority: authority, } } From 138eb4555195031b8e9226ffc71edecf18bca378 Mon Sep 17 00:00:00 2001 From: Andrei Zavgorodnii Date: Thu, 13 Jun 2024 19:25:14 +0100 Subject: [PATCH 28/87] comments & refactoring --- x/tokenfactory/keeper/bankactions.go | 2 +- x/tokenfactory/keeper/keeper_test.go | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/x/tokenfactory/keeper/bankactions.go b/x/tokenfactory/keeper/bankactions.go index 284728258..630b14eca 100644 --- a/x/tokenfactory/keeper/bankactions.go +++ b/x/tokenfactory/keeper/bankactions.go @@ -93,7 +93,7 @@ func (k Keeper) isModuleAccount(ctx sdk.Context, addr sdk.AccAddress) bool { for _, moduleName := range k.knownModules { account := k.accountKeeper.GetModuleAccount(ctx, moduleName) if account == nil { - return false + continue } if account.GetAddress().Equals(addr) { diff --git a/x/tokenfactory/keeper/keeper_test.go b/x/tokenfactory/keeper/keeper_test.go index c6fd3772a..b4864b641 100644 --- a/x/tokenfactory/keeper/keeper_test.go +++ b/x/tokenfactory/keeper/keeper_test.go @@ -126,6 +126,9 @@ func (suite *KeeperTestSuite) TestForceTransferMsg() { _, err = suite.msgServer.ForceTransfer(suite.ChainA.GetContext(), types.NewMsgForceTransfer(suite.TestAccs[0].String(), mintAmt, govModAcc.GetAddress().String(), suite.TestAccs[1].String())) suite.Require().ErrorContains(err, "force transfer from module acc not available") + + _, err = suite.msgServer.ForceTransfer(suite.ChainA.GetContext(), types.NewMsgForceTransfer(suite.TestAccs[0].String(), mintAmt, suite.TestAccs[1].String(), govModAcc.GetAddress().String())) + suite.Require().ErrorContains(err, "force transfer to module acc not available") }) } @@ -135,7 +138,7 @@ func (suite *KeeperTestSuite) TestMintToMsg() { // Create a denom suite.CreateDefaultDenom(suite.ChainA.GetContext()) - suite.Run("test force transfer", func() { + suite.Run("test mint to", func() { mintAmt := sdktypes.NewInt64Coin(suite.defaultDenom, 10) govModAcc := suite.GetNeutronZoneApp(suite.ChainA).AccountKeeper.GetModuleAccount(suite.ChainA.GetContext(), authtypes.FeeCollectorName) @@ -151,7 +154,7 @@ func (suite *KeeperTestSuite) TestBurnFromMsg() { // Create a denom suite.CreateDefaultDenom(suite.ChainA.GetContext()) - suite.Run("test force transfer", func() { + suite.Run("test burn from", func() { mintAmt := sdktypes.NewInt64Coin(suite.defaultDenom, 10) _, err := suite.msgServer.Mint(sdktypes.WrapSDKContext(suite.ChainA.GetContext()), types.NewMsgMint(suite.TestAccs[0].String(), mintAmt)) From 6a2c9c14f06bae8937f795cd81ae4529076f1f61 Mon Sep 17 00:00:00 2001 From: Andrei Zavgorodnii Date: Fri, 14 Jun 2024 10:17:35 +0100 Subject: [PATCH 29/87] fixed PerformMint --- wasmbinding/message_plugin.go | 7 +------ x/tokenfactory/keeper/bankactions.go | 6 +++--- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/wasmbinding/message_plugin.go b/wasmbinding/message_plugin.go index dd3564787..fc27ca932 100644 --- a/wasmbinding/message_plugin.go +++ b/wasmbinding/message_plugin.go @@ -692,7 +692,7 @@ func PerformMint(f *tokenfactorykeeper.Keeper, b *bankkeeper.BaseKeeper, ctx sdk } coin := sdk.Coin{Denom: mint.Denom, Amount: mint.Amount} - sdkMsg := tokenfactorytypes.NewMsgMint(contractAddr.String(), coin) + sdkMsg := tokenfactorytypes.NewMsgMintTo(contractAddr.String(), coin, rcpt.String()) // Mint through token factory / message server msgServer := tokenfactorykeeper.NewMsgServerImpl(*f) @@ -701,11 +701,6 @@ func PerformMint(f *tokenfactorykeeper.Keeper, b *bankkeeper.BaseKeeper, ctx sdk return errors.Wrap(err, "minting coins from message") } - err = b.SendCoins(ctx, contractAddr, rcpt, sdk.NewCoins(coin)) - if err != nil { - return errors.Wrap(err, "sending newly minted coins from message") - } - return nil } diff --git a/x/tokenfactory/keeper/bankactions.go b/x/tokenfactory/keeper/bankactions.go index 630b14eca..9398f7ed7 100644 --- a/x/tokenfactory/keeper/bankactions.go +++ b/x/tokenfactory/keeper/bankactions.go @@ -41,17 +41,17 @@ func (k Keeper) burnFrom(ctx sdk.Context, amount sdk.Coin, burnFrom string) erro return err } - addr, err := sdk.AccAddressFromBech32(burnFrom) + burnFromAddr, err := sdk.AccAddressFromBech32(burnFrom) if err != nil { return err } - if k.isModuleAccount(ctx, addr) { + if k.isModuleAccount(ctx, burnFromAddr) { return status.Errorf(codes.Internal, "burning from module accounts is forbidden") } err = k.bankKeeper.SendCoinsFromAccountToModule(ctx, - addr, + burnFromAddr, types.ModuleName, sdk.NewCoins(amount)) if err != nil { From b2447ae9471fb5faa9ac9b4eb92e542347f220af Mon Sep 17 00:00:00 2001 From: Andrei Zavgorodnii Date: Fri, 14 Jun 2024 13:09:50 +0100 Subject: [PATCH 30/87] lint --- wasmbinding/message_plugin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wasmbinding/message_plugin.go b/wasmbinding/message_plugin.go index fc27ca932..a22c5e78d 100644 --- a/wasmbinding/message_plugin.go +++ b/wasmbinding/message_plugin.go @@ -685,7 +685,7 @@ func (m *CustomMessenger) setBeforeSendHook(ctx sdk.Context, contractAddr sdk.Ac } // PerformMint used with mintTokens to validate the mint message and mint through token factory. -func PerformMint(f *tokenfactorykeeper.Keeper, b *bankkeeper.BaseKeeper, ctx sdk.Context, contractAddr sdk.AccAddress, mint *bindings.MintTokens) error { +func PerformMint(f *tokenfactorykeeper.Keeper, _ *bankkeeper.BaseKeeper, ctx sdk.Context, contractAddr sdk.AccAddress, mint *bindings.MintTokens) error { rcpt, err := parseAddress(mint.MintToAddress) if err != nil { return err From 7fd552493303904a1d399e89b38bb56df52000a4 Mon Sep 17 00:00:00 2001 From: sotnikov-s Date: Fri, 14 Jun 2024 15:32:54 +0300 Subject: [PATCH 31/87] rm deprecated sdktypes.WrapSDKContext usage --- x/tokenfactory/keeper/keeper_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/tokenfactory/keeper/keeper_test.go b/x/tokenfactory/keeper/keeper_test.go index b4864b641..96fcbebda 100644 --- a/x/tokenfactory/keeper/keeper_test.go +++ b/x/tokenfactory/keeper/keeper_test.go @@ -157,7 +157,7 @@ func (suite *KeeperTestSuite) TestBurnFromMsg() { suite.Run("test burn from", func() { mintAmt := sdktypes.NewInt64Coin(suite.defaultDenom, 10) - _, err := suite.msgServer.Mint(sdktypes.WrapSDKContext(suite.ChainA.GetContext()), types.NewMsgMint(suite.TestAccs[0].String(), mintAmt)) + _, err := suite.msgServer.Mint(suite.ChainA.GetContext(), types.NewMsgMint(suite.TestAccs[0].String(), mintAmt)) suite.Require().NoError(err) govModAcc := suite.GetNeutronZoneApp(suite.ChainA).AccountKeeper.GetModuleAccount(suite.ChainA.GetContext(), authtypes.FeeCollectorName) From db871ba0800eb17176509ab1eacc2bc3a0100814 Mon Sep 17 00:00:00 2001 From: sotnikov-s Date: Fri, 14 Jun 2024 17:09:02 +0300 Subject: [PATCH 32/87] clean up var names in tokenfactory bank actions --- x/tokenfactory/keeper/bankactions.go | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/x/tokenfactory/keeper/bankactions.go b/x/tokenfactory/keeper/bankactions.go index 9398f7ed7..bb3e21faa 100644 --- a/x/tokenfactory/keeper/bankactions.go +++ b/x/tokenfactory/keeper/bankactions.go @@ -15,12 +15,12 @@ func (k Keeper) mintTo(ctx sdk.Context, amount sdk.Coin, mintTo string) error { return err } - addr, err := sdk.AccAddressFromBech32(mintTo) + mintToAcc, err := sdk.AccAddressFromBech32(mintTo) if err != nil { return err } - if k.isModuleAccount(ctx, addr) { + if k.isModuleAccount(ctx, mintToAcc) { return status.Errorf(codes.Internal, "minting to module accounts is forbidden") } @@ -30,7 +30,7 @@ func (k Keeper) mintTo(ctx sdk.Context, amount sdk.Coin, mintTo string) error { } return k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, - addr, + mintToAcc, sdk.NewCoins(amount)) } @@ -41,17 +41,17 @@ func (k Keeper) burnFrom(ctx sdk.Context, amount sdk.Coin, burnFrom string) erro return err } - burnFromAddr, err := sdk.AccAddressFromBech32(burnFrom) + burnFromAcc, err := sdk.AccAddressFromBech32(burnFrom) if err != nil { return err } - if k.isModuleAccount(ctx, burnFromAddr) { + if k.isModuleAccount(ctx, burnFromAcc) { return status.Errorf(codes.Internal, "burning from module accounts is forbidden") } err = k.bankKeeper.SendCoinsFromAccountToModule(ctx, - burnFromAddr, + burnFromAcc, types.ModuleName, sdk.NewCoins(amount)) if err != nil { @@ -68,25 +68,25 @@ func (k Keeper) forceTransfer(ctx sdk.Context, amount sdk.Coin, fromAddr, toAddr return err } - fromSdkAddr, err := sdk.AccAddressFromBech32(fromAddr) + transferFromAcc, err := sdk.AccAddressFromBech32(fromAddr) if err != nil { return err } - toSdkAddr, err := sdk.AccAddressFromBech32(toAddr) + transferToAcc, err := sdk.AccAddressFromBech32(toAddr) if err != nil { return err } - if k.isModuleAccount(ctx, fromSdkAddr) { + if k.isModuleAccount(ctx, transferFromAcc) { return status.Errorf(codes.Internal, "force transfer from module acc not available") } - if k.isModuleAccount(ctx, toSdkAddr) { + if k.isModuleAccount(ctx, transferToAcc) { return status.Errorf(codes.Internal, "force transfer to module acc not available") } - return k.bankKeeper.SendCoins(ctx, fromSdkAddr, toSdkAddr, sdk.NewCoins(amount)) + return k.bankKeeper.SendCoins(ctx, transferFromAcc, transferToAcc, sdk.NewCoins(amount)) } func (k Keeper) isModuleAccount(ctx sdk.Context, addr sdk.AccAddress) bool { From e32aa4fc03e4aa85f54d096afdeb27929e6bb8d3 Mon Sep 17 00:00:00 2001 From: sotnikov-s Date: Fri, 14 Jun 2024 17:23:12 +0300 Subject: [PATCH 33/87] improve wording in tokenfactory force transfer errors --- x/tokenfactory/keeper/bankactions.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x/tokenfactory/keeper/bankactions.go b/x/tokenfactory/keeper/bankactions.go index bb3e21faa..5e7b650f9 100644 --- a/x/tokenfactory/keeper/bankactions.go +++ b/x/tokenfactory/keeper/bankactions.go @@ -79,11 +79,11 @@ func (k Keeper) forceTransfer(ctx sdk.Context, amount sdk.Coin, fromAddr, toAddr } if k.isModuleAccount(ctx, transferFromAcc) { - return status.Errorf(codes.Internal, "force transfer from module acc not available") + return status.Errorf(codes.Internal, "force transfer from module accounts is forbidden") } if k.isModuleAccount(ctx, transferToAcc) { - return status.Errorf(codes.Internal, "force transfer to module acc not available") + return status.Errorf(codes.Internal, "force transfer to module accounts is forbidden") } return k.bankKeeper.SendCoins(ctx, transferFromAcc, transferToAcc, sdk.NewCoins(amount)) From 8db652f6dc6fff52560f1d787f448acb3c565005 Mon Sep 17 00:00:00 2001 From: sotnikov-s Date: Fri, 14 Jun 2024 17:32:09 +0300 Subject: [PATCH 34/87] fix force transfer error msgs in tokenfactory tests --- x/tokenfactory/keeper/keeper_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x/tokenfactory/keeper/keeper_test.go b/x/tokenfactory/keeper/keeper_test.go index 96fcbebda..335ff509e 100644 --- a/x/tokenfactory/keeper/keeper_test.go +++ b/x/tokenfactory/keeper/keeper_test.go @@ -125,10 +125,10 @@ func (suite *KeeperTestSuite) TestForceTransferMsg() { suite.Require().NoError(err) _, err = suite.msgServer.ForceTransfer(suite.ChainA.GetContext(), types.NewMsgForceTransfer(suite.TestAccs[0].String(), mintAmt, govModAcc.GetAddress().String(), suite.TestAccs[1].String())) - suite.Require().ErrorContains(err, "force transfer from module acc not available") + suite.Require().ErrorContains(err, "force transfer from module accounts is forbidden") _, err = suite.msgServer.ForceTransfer(suite.ChainA.GetContext(), types.NewMsgForceTransfer(suite.TestAccs[0].String(), mintAmt, suite.TestAccs[1].String(), govModAcc.GetAddress().String())) - suite.Require().ErrorContains(err, "force transfer to module acc not available") + suite.Require().ErrorContains(err, "force transfer to module accounts is forbidden") }) } From 0766ef99411aa058a2b8b33e0017fcecee72a572 Mon Sep 17 00:00:00 2001 From: Julian Compagni Portis Date: Fri, 14 Jun 2024 18:39:53 -0400 Subject: [PATCH 35/87] Add a migration to recalculate price to use high prec_dec precision --- x/dex/migrations/v3/store.go | 87 +++++++++++++++++++++++++++++-- x/dex/migrations/v3/store_test.go | 54 +++++++++++++++++++ 2 files changed, 138 insertions(+), 3 deletions(-) diff --git a/x/dex/migrations/v3/store.go b/x/dex/migrations/v3/store.go index 5180eeae7..c9404d239 100644 --- a/x/dex/migrations/v3/store.go +++ b/x/dex/migrations/v3/store.go @@ -15,11 +15,23 @@ import ( // MigrateStore performs in-place store migrations. // The migration adds new dex params -- GoodTilPurgeAllowance & MaxJITsPerBlock// for handling JIT orders. func MigrateStore(ctx sdk.Context, cdc codec.BinaryCodec, storeKey storetypes.StoreKey) error { - err := migrateParams(ctx, cdc, storeKey) - if err != nil { + if err := migrateParams(ctx, cdc, storeKey); err != nil { + return err + } + + if err := migrateLimitOrderExpirations(ctx, cdc, storeKey); err != nil { return err } - return migrateLimitOrderExpirations(ctx, cdc, storeKey) + + if err := migrateTickLiquidityPrices(ctx, cdc, storeKey); err != nil { + return err + } + + if err := migrateInactiveTranchePrices(ctx, cdc, storeKey); err != nil { + return err + } + + return nil } func migrateParams(ctx sdk.Context, cdc codec.BinaryCodec, storeKey storetypes.StoreKey) error { @@ -92,3 +104,72 @@ func migrateLimitOrderExpirations(ctx sdk.Context, cdc codec.BinaryCodec, storeK return nil } + +func migrateTickLiquidityPrices(ctx sdk.Context, cdc codec.BinaryCodec, storeKey storetypes.StoreKey) error { + ctx.Logger().Info("Migrating TickLiquidity Prices...") + + // Iterate through all tickLiquidity + store := prefix.NewStore(ctx.KVStore(storeKey), types.KeyPrefix(types.TickLiquidityKeyPrefix)) + iterator := storetypes.KVStorePrefixIterator(store, []byte{}) + + for ; iterator.Valid(); iterator.Next() { + var tickLiq types.TickLiquidity + var updatedTickLiq types.TickLiquidity + cdc.MustUnmarshal(iterator.Value(), &tickLiq) + // Recalculate all prices by precisionUpdateMultiplier + switch liquidity := tickLiq.Liquidity.(type) { + case *types.TickLiquidity_LimitOrderTranche: + liquidity.LimitOrderTranche.PriceTakerToMaker = types.MustCalcPrice(liquidity.LimitOrderTranche.Key.TickIndexTakerToMaker) + updatedTickLiq = types.TickLiquidity{Liquidity: liquidity} + case *types.TickLiquidity_PoolReserves: + poolReservesKey := liquidity.PoolReserves.Key + liquidity.PoolReserves.PriceTakerToMaker = types.MustCalcPrice(poolReservesKey.TickIndexTakerToMaker) + liquidity.PoolReserves.PriceOppositeTakerToMaker = poolReservesKey.Counterpart().MustPriceTakerToMaker() + updatedTickLiq = types.TickLiquidity{Liquidity: liquidity} + + default: + panic("Tick does not contain valid liqudityType") + } + // Store the updated tickLiquidity + bz := cdc.MustMarshal(&updatedTickLiq) + store.Set(iterator.Key(), bz) + } + + err := iterator.Close() + if err != nil { + return err + } + + ctx.Logger().Info("Finished migrating TickLiquidity Prices...") + + return nil +} + +func migrateInactiveTranchePrices(ctx sdk.Context, cdc codec.BinaryCodec, storeKey storetypes.StoreKey) error { + ctx.Logger().Info("Migrating InactiveLimitOrderTranche Prices...") + + // Iterate through all tickLiquidity + store := prefix.NewStore(ctx.KVStore(storeKey), types.KeyPrefix(types.InactiveLimitOrderTrancheKeyPrefix)) + iterator := storetypes.KVStorePrefixIterator(store, []byte{}) + + for ; iterator.Valid(); iterator.Next() { + var tranche types.LimitOrderTranche + cdc.MustUnmarshal(iterator.Value(), &tranche) + // Multiply all price by precisionUpdateMultiplier + + tranche.PriceTakerToMaker = types.MustCalcPrice(tranche.Key.TickIndexTakerToMaker) + + // Store the updated tickLiquidity + bz := cdc.MustMarshal(&tranche) + store.Set(iterator.Key(), bz) + } + + err := iterator.Close() + if err != nil { + return err + } + + ctx.Logger().Info("Finished Migrating InactiveLimitOrderTranche Prices...") + + return nil +} diff --git a/x/dex/migrations/v3/store_test.go b/x/dex/migrations/v3/store_test.go index 7dc44dc37..8e4c3caf1 100644 --- a/x/dex/migrations/v3/store_test.go +++ b/x/dex/migrations/v3/store_test.go @@ -117,3 +117,57 @@ func (suite *V3DexMigrationTestSuite) TestLimitOrderExpirationUpgrade() { allExp := app.DexKeeper.GetAllLimitOrderExpiration(ctx) suite.Require().Equal(len(lOExpirations), len(allExp)) } + +func (suite *V3DexMigrationTestSuite) TestPriceUpdates() { + var ( + app = suite.GetNeutronZoneApp(suite.ChainA) + storeKey = app.GetKey(types.StoreKey) + ctx = suite.ChainA.GetContext() + cdc = app.AppCodec() + ) + + // Write tranche with incorrect price + trancheKey := &types.LimitOrderTrancheKey{ + TradePairId: types.MustNewTradePairID("TokenA", "TokenB"), + TickIndexTakerToMaker: -50, + TrancheKey: "123", + } + tranche := &types.LimitOrderTranche{ + Key: trancheKey, + PriceTakerToMaker: math.ZeroPrecDec(), + } + // create active tranche + app.DexKeeper.SetLimitOrderTranche(ctx, tranche) + // create inactive tranche + app.DexKeeper.SetInactiveLimitOrderTranche(ctx, tranche) + + // Write poolReserves with old precision + poolKey := &types.PoolReservesKey{ + TradePairId: types.MustNewTradePairID("TokenA", "TokenB"), + TickIndexTakerToMaker: 60000, + Fee: 1, + } + poolReserves := &types.PoolReserves{ + Key: poolKey, + PriceTakerToMaker: math.ZeroPrecDec(), + PriceOppositeTakerToMaker: math.ZeroPrecDec(), + } + + app.DexKeeper.SetPoolReserves(ctx, poolReserves) + + // Run migration + suite.NoError(v3.MigrateStore(ctx, cdc, storeKey)) + + // Check LimitOrderTranche has correct price + newTranche := app.DexKeeper.GetLimitOrderTranche(ctx, trancheKey) + suite.True(newTranche.PriceTakerToMaker.Equal(math.MustNewPrecDecFromStr("1.005012269623051203500693815")), "was : %v", newTranche.PriceTakerToMaker) + + // check InactiveLimitOrderTranche has correct price + inactiveTranche, _ := app.DexKeeper.GetInactiveLimitOrderTranche(ctx, trancheKey) + suite.True(inactiveTranche.PriceTakerToMaker.Equal(math.MustNewPrecDecFromStr("1.005012269623051203500693815")), "was : %v", newTranche.PriceTakerToMaker) + + // Check PoolReserves has the correct prices + newPool, _ := app.DexKeeper.GetPoolReserves(ctx, poolKey) + suite.True(newPool.PriceTakerToMaker.Equal(math.MustNewPrecDecFromStr("0.002479495864288162666675923")), "was : %v", newPool.PriceTakerToMaker) + suite.True(newPool.PriceOppositeTakerToMaker.Equal(math.MustNewPrecDecFromStr("403.227141612124702272520931931")), "was : %v", newPool.PriceOppositeTakerToMaker) +} From ae627fef7cfb354f05d8fe785ef4237657020efd Mon Sep 17 00:00:00 2001 From: Julian Compagni Portis Date: Fri, 14 Jun 2024 18:56:51 -0400 Subject: [PATCH 36/87] misc formatting and cleanup --- x/dex/migrations/v3/store.go | 4 +++- x/dex/migrations/v3/store_test.go | 15 +++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/x/dex/migrations/v3/store.go b/x/dex/migrations/v3/store.go index c9404d239..1f3079a46 100644 --- a/x/dex/migrations/v3/store.go +++ b/x/dex/migrations/v3/store.go @@ -106,6 +106,7 @@ func migrateLimitOrderExpirations(ctx sdk.Context, cdc codec.BinaryCodec, storeK } func migrateTickLiquidityPrices(ctx sdk.Context, cdc codec.BinaryCodec, storeKey storetypes.StoreKey) error { + // Due to change in precision of PrecDec between v2 and v3 we need to recompute all PrecDecs in the kvstore ctx.Logger().Info("Migrating TickLiquidity Prices...") // Iterate through all tickLiquidity @@ -146,6 +147,7 @@ func migrateTickLiquidityPrices(ctx sdk.Context, cdc codec.BinaryCodec, storeKey } func migrateInactiveTranchePrices(ctx sdk.Context, cdc codec.BinaryCodec, storeKey storetypes.StoreKey) error { + // Due to change in precision of PrecDec between v2 and v3 we need to recompute all PrecDecs in the kvstore ctx.Logger().Info("Migrating InactiveLimitOrderTranche Prices...") // Iterate through all tickLiquidity @@ -169,7 +171,7 @@ func migrateInactiveTranchePrices(ctx sdk.Context, cdc codec.BinaryCodec, storeK return err } - ctx.Logger().Info("Finished Migrating InactiveLimitOrderTranche Prices...") + ctx.Logger().Info("Finished migrating InactiveLimitOrderTranche Prices...") return nil } diff --git a/x/dex/migrations/v3/store_test.go b/x/dex/migrations/v3/store_test.go index 8e4c3caf1..5f9e4a7ba 100644 --- a/x/dex/migrations/v3/store_test.go +++ b/x/dex/migrations/v3/store_test.go @@ -136,12 +136,12 @@ func (suite *V3DexMigrationTestSuite) TestPriceUpdates() { Key: trancheKey, PriceTakerToMaker: math.ZeroPrecDec(), } - // create active tranche app.DexKeeper.SetLimitOrderTranche(ctx, tranche) - // create inactive tranche + + // also create inactive tranche app.DexKeeper.SetInactiveLimitOrderTranche(ctx, tranche) - // Write poolReserves with old precision + // Write poolReserves with incorrect prices poolKey := &types.PoolReservesKey{ TradePairId: types.MustNewTradePairID("TokenA", "TokenB"), TickIndexTakerToMaker: 60000, @@ -152,7 +152,6 @@ func (suite *V3DexMigrationTestSuite) TestPriceUpdates() { PriceTakerToMaker: math.ZeroPrecDec(), PriceOppositeTakerToMaker: math.ZeroPrecDec(), } - app.DexKeeper.SetPoolReserves(ctx, poolReserves) // Run migration @@ -160,14 +159,14 @@ func (suite *V3DexMigrationTestSuite) TestPriceUpdates() { // Check LimitOrderTranche has correct price newTranche := app.DexKeeper.GetLimitOrderTranche(ctx, trancheKey) - suite.True(newTranche.PriceTakerToMaker.Equal(math.MustNewPrecDecFromStr("1.005012269623051203500693815")), "was : %v", newTranche.PriceTakerToMaker) + suite.True(newTranche.PriceTakerToMaker.Equal(math.MustNewPrecDecFromStr("1.005012269623051203500693815"))) // check InactiveLimitOrderTranche has correct price inactiveTranche, _ := app.DexKeeper.GetInactiveLimitOrderTranche(ctx, trancheKey) - suite.True(inactiveTranche.PriceTakerToMaker.Equal(math.MustNewPrecDecFromStr("1.005012269623051203500693815")), "was : %v", newTranche.PriceTakerToMaker) + suite.True(inactiveTranche.PriceTakerToMaker.Equal(math.MustNewPrecDecFromStr("1.005012269623051203500693815"))) // Check PoolReserves has the correct prices newPool, _ := app.DexKeeper.GetPoolReserves(ctx, poolKey) - suite.True(newPool.PriceTakerToMaker.Equal(math.MustNewPrecDecFromStr("0.002479495864288162666675923")), "was : %v", newPool.PriceTakerToMaker) - suite.True(newPool.PriceOppositeTakerToMaker.Equal(math.MustNewPrecDecFromStr("403.227141612124702272520931931")), "was : %v", newPool.PriceOppositeTakerToMaker) + suite.True(newPool.PriceTakerToMaker.Equal(math.MustNewPrecDecFromStr("0.002479495864288162666675923"))) + suite.True(newPool.PriceOppositeTakerToMaker.Equal(math.MustNewPrecDecFromStr("403.227141612124702272520931931"))) } From 5567f12bb4d954a774f5b827dbf025c4d18910ac Mon Sep 17 00:00:00 2001 From: keylogic1 <119584546+keylogic1@users.noreply.github.com> Date: Sat, 15 Jun 2024 17:31:44 +0300 Subject: [PATCH 37/87] Extend CI for v3 releases --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 041d09da4..afb5a822c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,10 +4,12 @@ on: push: branches: - "main" + - "releases/v3.x" - "chore/fix-ci" pull_request: branches: - "main" + - "releases/v3.x" - "chore/fix-ci" jobs: From d28a269867eb6b3887c177c646329b01cc7e559e Mon Sep 17 00:00:00 2001 From: keylogic1 <119584546+keylogic1@users.noreply.github.com> Date: Sat, 15 Jun 2024 17:39:42 +0300 Subject: [PATCH 38/87] CI: Revert worker selection for PR notifications --- .github/workflows/pr.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 4904231fc..6d9db1f17 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -13,7 +13,7 @@ jobs: # This job only runs for pull request comments name: PR comment if: ${{ github.event.issue.pull_request }} - runs-on: self-hosted + runs-on: ubuntu-latest steps: - name: Send Notification uses: appleboy/telegram-action@master @@ -26,7 +26,7 @@ jobs: pull_requests_and_review: name: Pull request action or review if: ${{ !github.event.issue.pull_request }} - runs-on: self-hosted + runs-on: ubuntu-latest steps: - name: Send Notification uses: appleboy/telegram-action@master From 7139c62460e908ba5963d1a84e0ea9d0468fd8da Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Mon, 17 Jun 2024 11:52:42 +0300 Subject: [PATCH 39/87] feemarket v1.0.3 --- go.mod | 4 ++-- go.sum | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 2ab400981..e431cd830 100644 --- a/go.mod +++ b/go.mod @@ -38,10 +38,10 @@ require ( github.com/prometheus/client_golang v1.19.1 github.com/rs/zerolog v1.32.0 github.com/skip-mev/block-sdk/v2 v2.1.2 - github.com/skip-mev/feemarket v1.0.0 + github.com/skip-mev/feemarket v1.0.3 github.com/skip-mev/slinky v1.0.1-rc github.com/spf13/cast v1.6.0 - github.com/spf13/cobra v1.8.0 + github.com/spf13/cobra v1.8.1 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.19.0 github.com/stretchr/testify v1.9.0 diff --git a/go.sum b/go.sum index 98d4bb3d4..bd1ce405e 100644 --- a/go.sum +++ b/go.sum @@ -413,8 +413,8 @@ github.com/cosmos/ledger-cosmos-go v0.13.3/go.mod h1:HENcEP+VtahZFw38HZ3+LS3Iv5X github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= 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.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I= github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= @@ -1089,8 +1089,8 @@ github.com/skip-mev/block-sdk/v2 v2.1.2 h1:fNKbrb+PVVzuU0JiSuWgBV4Afj5zZ1VeHQJp8 github.com/skip-mev/block-sdk/v2 v2.1.2/go.mod h1:kIq7SMva0/eHKTCiG/oI5XGxD4HNVK0t71TrUZqHcvA= github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610 h1:4JlsiRVt/YZOvrKH525T7sZXgEWUEjqSDMwE6fXNbdo= github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610/go.mod h1:kB8gFZX07CyJnw8q9iEZijI3qJTIe1K/Y++P5VGkrcg= -github.com/skip-mev/feemarket v1.0.0 h1:6saDWTgCedMSBur+xLCURtZsxMX/CHmflhA/zuMo+7w= -github.com/skip-mev/feemarket v1.0.0/go.mod h1:52iSehc6mb98xPhRYRqg4crAIxz32RWTbK/LXOwRuf4= +github.com/skip-mev/feemarket v1.0.3 h1:DpB1tj51MlFN5iOg1lN+fwWqSF62xdND46BqgTko0C4= +github.com/skip-mev/feemarket v1.0.3/go.mod h1:lszt7zGEEActbDYq1hOKogQvfCsnLEHH5113LwgmYcE= github.com/skip-mev/slinky v1.0.1-rc h1:DB2gwc20AbfcnZhfhHg7cT2rsc8FhkUbvC6NVmWt7oQ= github.com/skip-mev/slinky v1.0.1-rc/go.mod h1:DvvvuNshfoEjDRMs6qgbSJu/cV+g1I9z7lAXzt77WHE= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= @@ -1110,8 +1110,8 @@ github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= 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.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= From 0e8cb5680c9f41ba8d699cab69debf3c67a4a6fc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jun 2024 08:12:29 +0000 Subject: [PATCH 40/87] Bump github.com/skip-mev/slinky from 1.0.1-rc to 1.0.1 Bumps [github.com/skip-mev/slinky](https://github.com/skip-mev/slinky) from 1.0.1-rc to 1.0.1. - [Release notes](https://github.com/skip-mev/slinky/releases) - [Changelog](https://github.com/skip-mev/slinky/blob/main/.goreleaser.yml) - [Commits](https://github.com/skip-mev/slinky/compare/v1.0.1-rc...v1.0.1) --- updated-dependencies: - dependency-name: github.com/skip-mev/slinky dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index e431cd830..62b72efc4 100644 --- a/go.mod +++ b/go.mod @@ -39,7 +39,7 @@ require ( github.com/rs/zerolog v1.32.0 github.com/skip-mev/block-sdk/v2 v2.1.2 github.com/skip-mev/feemarket v1.0.3 - github.com/skip-mev/slinky v1.0.1-rc + github.com/skip-mev/slinky v1.0.1 github.com/spf13/cast v1.6.0 github.com/spf13/cobra v1.8.1 github.com/spf13/pflag v1.0.5 @@ -166,7 +166,7 @@ require ( github.com/googleapis/gax-go/v2 v2.12.4 // indirect github.com/gorilla/handlers v1.5.2 // indirect github.com/gorilla/rpc v1.2.0 // indirect - github.com/gorilla/websocket v1.5.2 // indirect + github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect diff --git a/go.sum b/go.sum index bd1ce405e..5c6ab1f1f 100644 --- a/go.sum +++ b/go.sum @@ -710,8 +710,8 @@ github.com/gorilla/rpc v1.2.0 h1:WvvdC2lNeT1SP32zrIce5l0ECBfbAlmrmSBsuc57wfk= github.com/gorilla/rpc v1.2.0/go.mod h1:V4h9r+4sF5HnzqbwIez0fKSpANP0zlYd3qR7p36jkTQ= 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.5.2 h1:qoW6V1GT3aZxybsbC6oLnailWnB+qTMVwMreOso9XUw= -github.com/gorilla/websocket v1.5.2/go.mod h1:0n9H61RBAcf5/38py2MCYbxzPIY9rOkpvvMT24Rqs30= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= 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.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= @@ -1091,8 +1091,8 @@ github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610 h1:4JlsiRVt github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610/go.mod h1:kB8gFZX07CyJnw8q9iEZijI3qJTIe1K/Y++P5VGkrcg= github.com/skip-mev/feemarket v1.0.3 h1:DpB1tj51MlFN5iOg1lN+fwWqSF62xdND46BqgTko0C4= github.com/skip-mev/feemarket v1.0.3/go.mod h1:lszt7zGEEActbDYq1hOKogQvfCsnLEHH5113LwgmYcE= -github.com/skip-mev/slinky v1.0.1-rc h1:DB2gwc20AbfcnZhfhHg7cT2rsc8FhkUbvC6NVmWt7oQ= -github.com/skip-mev/slinky v1.0.1-rc/go.mod h1:DvvvuNshfoEjDRMs6qgbSJu/cV+g1I9z7lAXzt77WHE= +github.com/skip-mev/slinky v1.0.1 h1:z+T6MSZP09boqQnYkat5788iLY4reG37DaFp4J0T8+E= +github.com/skip-mev/slinky v1.0.1/go.mod h1:2MFWaJERFl/oe47ZlO97sTg56M0pvZ9MOckRo2mCwnU= 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= From e855c8f1901a6954dec97748baabd7f98b5e02bc Mon Sep 17 00:00:00 2001 From: Julian Compagni Portis Date: Tue, 18 Jun 2024 23:30:35 -0400 Subject: [PATCH 41/87] basic whitelist logic --- proto/osmosis/tokenfactory/params.proto | 39 ++ .../tokenfactory/v1beta1/genesis.proto | 2 +- .../osmosis/tokenfactory/v1beta1/params.proto | 2 +- .../osmosis/tokenfactory/v1beta1/query.proto | 2 +- proto/osmosis/tokenfactory/v1beta1/tx.proto | 2 +- wasmbinding/test/custom_message_test.go | 1 + wasmbinding/test/custom_query_test.go | 1 + x/tokenfactory/keeper/before_send.go | 5 + x/tokenfactory/keeper/before_send_test.go | 18 + x/tokenfactory/keeper/keeper_test.go | 1 + x/tokenfactory/keeper/params.go | 21 + x/tokenfactory/types/expected_keepers.go | 2 + x/tokenfactory/types/genesis.pb.go | 41 +- x/tokenfactory/types/params.go | 33 +- x/tokenfactory/types/params.pb.go | 338 ++++++++++++-- x/tokenfactory/types/query.pb.go | 88 ++-- x/tokenfactory/types/tx.go | 6 +- x/tokenfactory/types/tx.pb.go | 134 +++--- x/tokenfactory/types/v1beta1/params.pb.go | 442 ++++++++++++++++++ 19 files changed, 1002 insertions(+), 176 deletions(-) create mode 100644 proto/osmosis/tokenfactory/params.proto create mode 100644 x/tokenfactory/types/v1beta1/params.pb.go diff --git a/proto/osmosis/tokenfactory/params.proto b/proto/osmosis/tokenfactory/params.proto new file mode 100644 index 000000000..604da3956 --- /dev/null +++ b/proto/osmosis/tokenfactory/params.proto @@ -0,0 +1,39 @@ +syntax = "proto3"; +package osmosis.tokenfactory; + +import "cosmos/base/v1beta1/coin.proto"; +import "cosmos_proto/cosmos.proto"; +import "gogoproto/gogo.proto"; + +option go_package = "github.com/neutron-org/neutron/v4/x/tokenfactory/types"; + +message HookWhitelist { + uint64 code_id = 1 [(gogoproto.customname) = "CodeID"]; + string denom_creator = 2; +} + +// Params defines the parameters for the tokenfactory module. +message Params { + // DenomCreationFee defines the fee to be charged on the creation of a new + // denom. The fee is drawn from the MsgCreateDenom's sender account, and + // transferred to the community pool. + repeated cosmos.base.v1beta1.Coin denom_creation_fee = 1 [ + (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins", + (gogoproto.moretags) = "yaml:\"denom_creation_fee\"", + (gogoproto.nullable) = false + ]; + + // DenomCreationGasConsume defines the gas cost for creating a new denom. + // This is intended as a spam deterrence mechanism. + // + // See: https://github.com/CosmWasm/token-factory/issues/11 + uint64 denom_creation_gas_consume = 2 [ + (gogoproto.moretags) = "yaml:\"denom_creation_gas_consume\"", + (gogoproto.nullable) = true + ]; + + // FeeCollectorAddress is the address where fees collected from denom creation + // are sent to + string fee_collector_address = 3; + repeated HookWhitelist whitelisted_hooks = 4; +} diff --git a/proto/osmosis/tokenfactory/v1beta1/genesis.proto b/proto/osmosis/tokenfactory/v1beta1/genesis.proto index a7d695544..11c97c5f3 100644 --- a/proto/osmosis/tokenfactory/v1beta1/genesis.proto +++ b/proto/osmosis/tokenfactory/v1beta1/genesis.proto @@ -2,8 +2,8 @@ syntax = "proto3"; package osmosis.tokenfactory.v1beta1; import "gogoproto/gogo.proto"; +import "osmosis/tokenfactory/params.proto"; import "osmosis/tokenfactory/v1beta1/authorityMetadata.proto"; -import "osmosis/tokenfactory/v1beta1/params.proto"; option go_package = "github.com/neutron-org/neutron/v4/x/tokenfactory/types"; diff --git a/proto/osmosis/tokenfactory/v1beta1/params.proto b/proto/osmosis/tokenfactory/v1beta1/params.proto index 08d702017..e7e8b1b7a 100644 --- a/proto/osmosis/tokenfactory/v1beta1/params.proto +++ b/proto/osmosis/tokenfactory/v1beta1/params.proto @@ -5,7 +5,7 @@ import "cosmos/base/v1beta1/coin.proto"; import "cosmos_proto/cosmos.proto"; import "gogoproto/gogo.proto"; -option go_package = "github.com/neutron-org/neutron/v4/x/tokenfactory/types"; +option go_package = "github.com/neutron-org/neutron/v4/x/tokenfactory/types/v1beta1"; // Params defines the parameters for the tokenfactory module. message Params { diff --git a/proto/osmosis/tokenfactory/v1beta1/query.proto b/proto/osmosis/tokenfactory/v1beta1/query.proto index b01ab2344..d7b4d6f8d 100644 --- a/proto/osmosis/tokenfactory/v1beta1/query.proto +++ b/proto/osmosis/tokenfactory/v1beta1/query.proto @@ -3,8 +3,8 @@ package osmosis.tokenfactory.v1beta1; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; +import "osmosis/tokenfactory/params.proto"; import "osmosis/tokenfactory/v1beta1/authorityMetadata.proto"; -import "osmosis/tokenfactory/v1beta1/params.proto"; option go_package = "github.com/neutron-org/neutron/v4/x/tokenfactory/types"; diff --git a/proto/osmosis/tokenfactory/v1beta1/tx.proto b/proto/osmosis/tokenfactory/v1beta1/tx.proto index 2cf3f7fb7..e122fe71f 100644 --- a/proto/osmosis/tokenfactory/v1beta1/tx.proto +++ b/proto/osmosis/tokenfactory/v1beta1/tx.proto @@ -7,7 +7,7 @@ import "cosmos/base/v1beta1/coin.proto"; import "cosmos/msg/v1/msg.proto"; import "cosmos_proto/cosmos.proto"; import "gogoproto/gogo.proto"; -import "osmosis/tokenfactory/v1beta1/params.proto"; +import "osmosis/tokenfactory/params.proto"; option go_package = "github.com/neutron-org/neutron/v4/x/tokenfactory/types"; diff --git a/wasmbinding/test/custom_message_test.go b/wasmbinding/test/custom_message_test.go index 95c4519e1..760417c16 100644 --- a/wasmbinding/test/custom_message_test.go +++ b/wasmbinding/test/custom_message_test.go @@ -76,6 +76,7 @@ func (suite *CustomMessengerTestSuite) SetupTest() { sdk.NewCoins(sdk.NewInt64Coin(params.DefaultDenom, 10_000_000)), 0, FeeCollectorAddress, + tokenfactorytypes.DefaultWhitelistedHooks, )) suite.Require().NoError(err) diff --git a/wasmbinding/test/custom_query_test.go b/wasmbinding/test/custom_query_test.go index 8bef356d5..781151936 100644 --- a/wasmbinding/test/custom_query_test.go +++ b/wasmbinding/test/custom_query_test.go @@ -255,6 +255,7 @@ func (suite *CustomQuerierTestSuite) TestDenomAdmin() { sdk.NewCoins(sdk.NewInt64Coin(params.DefaultDenom, 10_000_000)), 0, FeeCollectorAddress, + tokenfactorytypes.DefaultWhitelistedHooks, )) suite.Require().NoError(err) diff --git a/x/tokenfactory/keeper/before_send.go b/x/tokenfactory/keeper/before_send.go index 69befbb7f..81e25796e 100644 --- a/x/tokenfactory/keeper/before_send.go +++ b/x/tokenfactory/keeper/before_send.go @@ -99,6 +99,11 @@ func (k Keeper) callBeforeSendListener(ctx context.Context, from, to sdk.AccAddr return err } + // Do not invoke hook if denom is not whitelisted and `from` is a module + if !k.isHookWhitelisted(c, coin.Denom, cwAddr) { + return nil + } + var msgBz []byte // get msgBz, either BlockBeforeSend or TrackBeforeSend diff --git a/x/tokenfactory/keeper/before_send_test.go b/x/tokenfactory/keeper/before_send_test.go index 540452d0e..0378ab92f 100644 --- a/x/tokenfactory/keeper/before_send_test.go +++ b/x/tokenfactory/keeper/before_send_test.go @@ -67,6 +67,24 @@ func (suite *KeeperTestSuite) TestTrackBeforeSendWasm() { queryResp, err := suite.GetNeutronZoneApp(suite.ChainA).WasmKeeper.QuerySmart(suite.ChainA.GetContext(), cosmwasmAddress, []byte(`{"total_supply_at":{}}`)) suite.Require().NoError(err) + + // Contract has not been called because it is not whitelisted + suite.Require().Equal("\"0\"", string(queryResp)) + + // Whitelist the hook + params := types.DefaultParams() + params.WhitelistedHooks = []*types.HookWhitelist{{DenomCreator: senderAddress.String(), CodeID: codeID}} + err = suite.GetNeutronZoneApp(suite.ChainA).TokenFactoryKeeper.SetParams(suite.ChainA.GetContext(), params) + suite.Require().NoError(err) + + // mint tokens again + _, err = suite.msgServer.Mint(suite.ChainA.GetContext(), types.NewMsgMint(suite.TestAccs[0].String(), tokenToSend)) + suite.Require().NoError(err) + + queryResp, err = suite.GetNeutronZoneApp(suite.ChainA).WasmKeeper.QuerySmart(suite.ChainA.GetContext(), cosmwasmAddress, []byte(`{"total_supply_at":{}}`)) + suite.Require().NoError(err) + + // Whitelisted contract has now been called suite.Require().Equal("\"100\"", string(queryResp)) }) } diff --git a/x/tokenfactory/keeper/keeper_test.go b/x/tokenfactory/keeper/keeper_test.go index 335ff509e..ac371decf 100644 --- a/x/tokenfactory/keeper/keeper_test.go +++ b/x/tokenfactory/keeper/keeper_test.go @@ -57,6 +57,7 @@ func (suite *KeeperTestSuite) Setup() { sdktypes.NewCoins(sdktypes.NewInt64Coin(params.DefaultDenom, TopUpCoinsAmount)), 0, FeeCollectorAddress, + types.DefaultWhitelistedHooks, )) suite.Require().NoError(err) diff --git a/x/tokenfactory/keeper/params.go b/x/tokenfactory/keeper/params.go index 4faa1764d..e9e124f7b 100644 --- a/x/tokenfactory/keeper/params.go +++ b/x/tokenfactory/keeper/params.go @@ -29,3 +29,24 @@ func (k Keeper) SetParams(ctx sdk.Context, params types.Params) error { store.Set(types.ParamsKey, bz) return nil } + +func (k Keeper) isHookWhitelisted(ctx sdk.Context, denom string, contractAddress sdk.AccAddress) bool { + contractInfo := k.contractKeeper.GetContractInfo(ctx, contractAddress) + if contractInfo == nil { + return false + } + codeID := contractInfo.CodeID + whitelistedHooks := k.GetParams(ctx).WhitelistedHooks + denomCreator, _, err := types.DeconstructDenom(denom) + if err != nil { + return false + } + + for _, hook := range whitelistedHooks { + if hook.CodeID == codeID && hook.DenomCreator == denomCreator { + return true + } + } + + return false +} diff --git a/x/tokenfactory/types/expected_keepers.go b/x/tokenfactory/types/expected_keepers.go index 6c65d173b..45e7d8b0e 100644 --- a/x/tokenfactory/types/expected_keepers.go +++ b/x/tokenfactory/types/expected_keepers.go @@ -3,6 +3,7 @@ package types import ( "context" + wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" ) @@ -36,4 +37,5 @@ type BankHooks interface { type ContractKeeper interface { Sudo(ctx context.Context, contractAddress sdk.AccAddress, msg []byte) ([]byte, error) + GetContractInfo(ctx context.Context, contractAddress sdk.AccAddress) *wasmtypes.ContractInfo } diff --git a/x/tokenfactory/types/genesis.pb.go b/x/tokenfactory/types/genesis.pb.go index 29435e226..5f90a3d83 100644 --- a/x/tokenfactory/types/genesis.pb.go +++ b/x/tokenfactory/types/genesis.pb.go @@ -143,30 +143,31 @@ func init() { } var fileDescriptor_5749c3f71850298b = []byte{ - // 368 bytes of a gzipped FileDescriptorProto + // 370 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0xca, 0x2f, 0xce, 0xcd, 0x2f, 0xce, 0x2c, 0xd6, 0x2f, 0xc9, 0xcf, 0x4e, 0xcd, 0x4b, 0x4b, 0x4c, 0x2e, 0xc9, 0x2f, 0xaa, 0xd4, 0x2f, 0x33, 0x4c, 0x4a, 0x2d, 0x49, 0x34, 0xd4, 0x4f, 0x4f, 0xcd, 0x4b, 0x2d, 0xce, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x81, 0xaa, 0xd5, 0x43, 0x56, 0xab, 0x07, 0x55, - 0x2b, 0x25, 0x92, 0x9e, 0x9f, 0x9e, 0x0f, 0x56, 0xa8, 0x0f, 0x62, 0x41, 0xf4, 0x48, 0x99, 0xe0, - 0x35, 0x3f, 0xb1, 0xb4, 0x24, 0x23, 0xbf, 0x28, 0xb3, 0xa4, 0xd2, 0x37, 0xb5, 0x24, 0x31, 0x25, - 0xb1, 0x24, 0x11, 0xaa, 0x4b, 0x13, 0xaf, 0xae, 0x82, 0xc4, 0xa2, 0xc4, 0x5c, 0xa8, 0xa3, 0x94, - 0x8e, 0x30, 0x72, 0xf1, 0xb8, 0x43, 0x9c, 0x19, 0x5c, 0x92, 0x58, 0x92, 0x2a, 0xe4, 0xc4, 0xc5, - 0x06, 0x51, 0x20, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x6d, 0xa4, 0xa2, 0x87, 0xcf, 0xd9, 0x7a, 0x01, - 0x60, 0xb5, 0x4e, 0x2c, 0x27, 0xee, 0xc9, 0x33, 0x04, 0x41, 0x75, 0x0a, 0x15, 0x70, 0xf1, 0x41, - 0xd5, 0xc5, 0xa7, 0xa4, 0xe6, 0xe5, 0xe7, 0x16, 0x4b, 0x30, 0x29, 0x30, 0x6b, 0x70, 0x1b, 0x69, - 0xe1, 0x37, 0x0b, 0xea, 0x0e, 0x17, 0x90, 0x16, 0x27, 0x59, 0x90, 0x89, 0x9f, 0xee, 0xc9, 0x8b, - 0x56, 0x26, 0xe6, 0xe6, 0x58, 0x29, 0xa1, 0x9a, 0xa7, 0x14, 0xc4, 0x0b, 0x15, 0x70, 0x81, 0xf0, - 0x8f, 0x22, 0xbc, 0x01, 0x16, 0x11, 0x52, 0xe3, 0x62, 0x05, 0x2b, 0x05, 0xfb, 0x82, 0xd3, 0x49, - 0xe0, 0xd3, 0x3d, 0x79, 0x1e, 0x88, 0x49, 0x60, 0x61, 0xa5, 0x20, 0x88, 0xb4, 0x50, 0x1b, 0x23, - 0x97, 0x10, 0x3c, 0x18, 0xe3, 0x73, 0xa1, 0xe1, 0x28, 0xc1, 0x04, 0xf6, 0xbb, 0x09, 0x7e, 0xf7, - 0x82, 0x6d, 0x72, 0x44, 0x8f, 0x03, 0x27, 0x45, 0xa8, 0xcb, 0x25, 0x21, 0xf6, 0x61, 0x9a, 0xae, - 0x14, 0x24, 0x88, 0x11, 0x73, 0x56, 0x2c, 0x2f, 0x16, 0xc8, 0x33, 0x3a, 0x05, 0x9c, 0x78, 0x24, - 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, 0xcb, 0x31, 0x5c, 0x78, - 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x94, 0x59, 0x7a, 0x66, 0x49, 0x46, 0x69, 0x92, 0x5e, - 0x72, 0x7e, 0xae, 0x7e, 0x5e, 0x6a, 0x69, 0x49, 0x51, 0x7e, 0x9e, 0x6e, 0x7e, 0x51, 0x3a, 0x8c, - 0xad, 0x5f, 0x66, 0xa2, 0x5f, 0x81, 0x1a, 0xdf, 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x49, 0x6c, 0xe0, - 0x78, 0x36, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xd1, 0xcf, 0x93, 0x08, 0xaa, 0x02, 0x00, 0x00, + 0x2b, 0x25, 0x92, 0x9e, 0x9f, 0x9e, 0x0f, 0x56, 0xa8, 0x0f, 0x62, 0x41, 0xf4, 0x48, 0x29, 0x62, + 0x35, 0xbf, 0x20, 0xb1, 0x28, 0x31, 0x17, 0x6a, 0xac, 0x94, 0x09, 0x5e, 0x27, 0x24, 0x96, 0x96, + 0x64, 0xe4, 0x17, 0x65, 0x96, 0x54, 0xfa, 0xa6, 0x96, 0x24, 0xa6, 0x24, 0x96, 0x24, 0x42, 0x74, + 0x29, 0xed, 0x61, 0xe4, 0xe2, 0x71, 0x87, 0x38, 0x2f, 0xb8, 0x24, 0xb1, 0x24, 0x55, 0xc8, 0x8a, + 0x8b, 0x0d, 0x62, 0xac, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0xb7, 0x91, 0x8c, 0x1e, 0x56, 0xe7, 0x06, + 0x80, 0xd5, 0x38, 0xb1, 0x9c, 0xb8, 0x27, 0xcf, 0x10, 0x04, 0xd5, 0x21, 0x54, 0xc0, 0xc5, 0x07, + 0x95, 0x8f, 0x4f, 0x49, 0xcd, 0xcb, 0xcf, 0x2d, 0x96, 0x60, 0x52, 0x60, 0xd6, 0xe0, 0x36, 0xd2, + 0xd2, 0xc3, 0xe7, 0x65, 0x3d, 0xa8, 0xfd, 0x2e, 0x20, 0x2d, 0x4e, 0xb2, 0x20, 0x13, 0x3f, 0xdd, + 0x93, 0x17, 0xad, 0x4c, 0xcc, 0xcd, 0xb1, 0x52, 0x42, 0x35, 0x4f, 0x29, 0x88, 0x17, 0x2a, 0xe0, + 0x02, 0xe1, 0x1f, 0x45, 0x38, 0x1f, 0x2c, 0x22, 0xa4, 0xc6, 0xc5, 0x0a, 0x56, 0x0a, 0x76, 0x3d, + 0xa7, 0x93, 0xc0, 0xa7, 0x7b, 0xf2, 0x3c, 0x10, 0x93, 0xc0, 0xc2, 0x4a, 0x41, 0x10, 0x69, 0xa1, + 0x36, 0x46, 0x2e, 0x21, 0x78, 0x98, 0xc4, 0xe7, 0x42, 0x03, 0x45, 0x82, 0x09, 0xec, 0x67, 0x13, + 0xfc, 0xee, 0x05, 0xdb, 0xe4, 0x88, 0x1e, 0xa0, 0x4e, 0x8a, 0x50, 0x97, 0x4b, 0x42, 0xec, 0xc3, + 0x34, 0x5d, 0x29, 0x48, 0x10, 0x23, 0x1a, 0xac, 0x58, 0x5e, 0x2c, 0x90, 0x67, 0x74, 0x0a, 0x38, + 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4, 0x18, 0x27, 0x3c, 0x96, 0x63, + 0xb8, 0xf0, 0x58, 0x8e, 0xe1, 0xc6, 0x63, 0x39, 0x86, 0x28, 0xb3, 0xf4, 0xcc, 0x92, 0x8c, 0xd2, + 0x24, 0xbd, 0xe4, 0xfc, 0x5c, 0xfd, 0xbc, 0xd4, 0xd2, 0x92, 0xa2, 0xfc, 0x3c, 0xdd, 0xfc, 0xa2, + 0x74, 0x18, 0x5b, 0xbf, 0xcc, 0x44, 0xbf, 0x02, 0x35, 0xca, 0x4b, 0x2a, 0x0b, 0x52, 0x8b, 0x93, + 0xd8, 0xc0, 0xf1, 0x6b, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0x27, 0x7d, 0x62, 0x1f, 0x9a, 0x02, + 0x00, 0x00, } func (this *GenesisDenom) Equal(that interface{}) bool { diff --git a/x/tokenfactory/types/params.go b/x/tokenfactory/types/params.go index 2e587c27a..06c1f76aa 100644 --- a/x/tokenfactory/types/params.go +++ b/x/tokenfactory/types/params.go @@ -12,10 +12,12 @@ var ( KeyDenomCreationFee = []byte("DenomCreationFee") KeyDenomCreationGasConsume = []byte("DenomCreationGasConsume") KeyFeeCollectorAddress = []byte("FeeCollectorAddress") + KeyWhitelistedHooks = []byte("WhitelistedHooks") // We don't want to charge users for denom creation DefaultDenomCreationFee sdk.Coins DefaultDenomCreationGasConsume uint64 DefaultFeeCollectorAddress = "" + DefaultWhitelistedHooks = []*HookWhitelist{} ) // ParamKeyTable the param key table for tokenfactory module. @@ -23,17 +25,18 @@ func ParamKeyTable() paramtypes.KeyTable { return paramtypes.NewKeyTable().RegisterParamSet(&Params{}) } -func NewParams(denomCreationFee sdk.Coins, denomCreationGasConsume uint64, feeCollectorAddress string) Params { +func NewParams(denomCreationFee sdk.Coins, denomCreationGasConsume uint64, feeCollectorAddress string, whitelistedHooks []*HookWhitelist) Params { return Params{ DenomCreationFee: denomCreationFee, DenomCreationGasConsume: denomCreationGasConsume, FeeCollectorAddress: feeCollectorAddress, + WhitelistedHooks: whitelistedHooks, } } // DefaultParams returns a default set of parameters func DefaultParams() Params { - return NewParams(DefaultDenomCreationFee, DefaultDenomCreationGasConsume, DefaultFeeCollectorAddress) + return NewParams(DefaultDenomCreationFee, DefaultDenomCreationGasConsume, DefaultFeeCollectorAddress, DefaultWhitelistedHooks) } // Validate validates params @@ -54,6 +57,10 @@ func (p Params) Validate() error { return fmt.Errorf("failed to validate params: %w", err) } + if err := validateWhitelistedHooks(p.WhitelistedHooks); err != nil { + return fmt.Errorf("failed to validate params: %w", err) + } + return nil } @@ -63,6 +70,7 @@ func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs { paramtypes.NewParamSetPair(KeyDenomCreationFee, &p.DenomCreationFee, validateDenomCreationFee), paramtypes.NewParamSetPair(KeyDenomCreationGasConsume, &p.DenomCreationGasConsume, validateDenomCreationGasConsume), paramtypes.NewParamSetPair(KeyFeeCollectorAddress, &p.FeeCollectorAddress, validateFeeCollectorAddress), + paramtypes.NewParamSetPair(KeyWhitelistedHooks, &p.WhitelistedHooks, validateWhitelistedHooks), } } @@ -105,3 +113,24 @@ func validateFeeCollectorAddress(i interface{}) error { return nil } + +func validateWhitelistedHooks(i interface{}) error { + hooks, ok := i.([]*HookWhitelist) + if !ok { + return fmt.Errorf("invalid parameter type: %T", i) + } + + seenHooks := map[string]bool{} + for _, hook := range hooks { + hookStr := hook.String() + if seenHooks[hookStr] { + return fmt.Errorf("duplicate whitelisted hook: %#v", hook) + } + seenHooks[hookStr] = true + _, err := sdk.AccAddressFromBech32(hook.DenomCreator) + if err != nil { + return fmt.Errorf("invalid denom creator address: %w", err) + } + } + return nil +} diff --git a/x/tokenfactory/types/params.pb.go b/x/tokenfactory/types/params.pb.go index fabd4e60f..d05e3c72d 100644 --- a/x/tokenfactory/types/params.pb.go +++ b/x/tokenfactory/types/params.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: osmosis/tokenfactory/v1beta1/params.proto +// source: osmosis/tokenfactory/params.proto package types @@ -27,6 +27,58 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +type HookWhitelist struct { + CodeID uint64 `protobuf:"varint,1,opt,name=code_id,json=codeId,proto3" json:"code_id,omitempty"` + DenomCreator string `protobuf:"bytes,2,opt,name=denom_creator,json=denomCreator,proto3" json:"denom_creator,omitempty"` +} + +func (m *HookWhitelist) Reset() { *m = HookWhitelist{} } +func (m *HookWhitelist) String() string { return proto.CompactTextString(m) } +func (*HookWhitelist) ProtoMessage() {} +func (*HookWhitelist) Descriptor() ([]byte, []int) { + return fileDescriptor_09c297db7c49d1cf, []int{0} +} +func (m *HookWhitelist) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *HookWhitelist) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_HookWhitelist.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 *HookWhitelist) XXX_Merge(src proto.Message) { + xxx_messageInfo_HookWhitelist.Merge(m, src) +} +func (m *HookWhitelist) XXX_Size() int { + return m.Size() +} +func (m *HookWhitelist) XXX_DiscardUnknown() { + xxx_messageInfo_HookWhitelist.DiscardUnknown(m) +} + +var xxx_messageInfo_HookWhitelist proto.InternalMessageInfo + +func (m *HookWhitelist) GetCodeID() uint64 { + if m != nil { + return m.CodeID + } + return 0 +} + +func (m *HookWhitelist) GetDenomCreator() string { + if m != nil { + return m.DenomCreator + } + return "" +} + // Params defines the parameters for the tokenfactory module. type Params struct { // DenomCreationFee defines the fee to be charged on the creation of a new @@ -40,14 +92,15 @@ type Params struct { DenomCreationGasConsume uint64 `protobuf:"varint,2,opt,name=denom_creation_gas_consume,json=denomCreationGasConsume,proto3" json:"denom_creation_gas_consume,omitempty" yaml:"denom_creation_gas_consume"` // FeeCollectorAddress is the address where fees collected from denom creation // are sent to - FeeCollectorAddress string `protobuf:"bytes,3,opt,name=fee_collector_address,json=feeCollectorAddress,proto3" json:"fee_collector_address,omitempty"` + FeeCollectorAddress string `protobuf:"bytes,3,opt,name=fee_collector_address,json=feeCollectorAddress,proto3" json:"fee_collector_address,omitempty"` + WhitelistedHooks []*HookWhitelist `protobuf:"bytes,4,rep,name=whitelisted_hooks,json=whitelistedHooks,proto3" json:"whitelisted_hooks,omitempty"` } func (m *Params) Reset() { *m = Params{} } func (m *Params) String() string { return proto.CompactTextString(m) } func (*Params) ProtoMessage() {} func (*Params) Descriptor() ([]byte, []int) { - return fileDescriptor_cc8299d306f3ff47, []int{0} + return fileDescriptor_09c297db7c49d1cf, []int{1} } func (m *Params) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -97,40 +150,86 @@ func (m *Params) GetFeeCollectorAddress() string { return "" } -func init() { - proto.RegisterType((*Params)(nil), "osmosis.tokenfactory.v1beta1.Params") +func (m *Params) GetWhitelistedHooks() []*HookWhitelist { + if m != nil { + return m.WhitelistedHooks + } + return nil } func init() { - proto.RegisterFile("osmosis/tokenfactory/v1beta1/params.proto", fileDescriptor_cc8299d306f3ff47) -} - -var fileDescriptor_cc8299d306f3ff47 = []byte{ - // 372 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x52, 0xb1, 0x6e, 0xe2, 0x40, - 0x10, 0xf5, 0xc2, 0x09, 0xe9, 0x7c, 0xcd, 0xc9, 0x77, 0x51, 0x00, 0x45, 0x36, 0x71, 0x65, 0x0a, - 0xbc, 0x82, 0x44, 0x29, 0xd2, 0x05, 0x4b, 0x49, 0x15, 0x09, 0x51, 0xa6, 0xb1, 0xd6, 0xf6, 0xd8, - 0xb1, 0xc0, 0x3b, 0xc8, 0xbb, 0xa0, 0xf0, 0x17, 0xa9, 0xf2, 0x11, 0xf9, 0x87, 0xf4, 0x94, 0x94, - 0xa9, 0x9c, 0x08, 0xfe, 0x80, 0x2f, 0x88, 0xb0, 0x4d, 0x04, 0x49, 0xaa, 0x9d, 0x99, 0xf7, 0xe6, - 0xcd, 0xdb, 0xd9, 0x55, 0xdb, 0x28, 0x12, 0x14, 0xb1, 0xa0, 0x12, 0x47, 0xc0, 0x43, 0xe6, 0x4b, - 0x4c, 0xe7, 0x74, 0xd6, 0xf5, 0x40, 0xb2, 0x2e, 0x9d, 0xb0, 0x94, 0x25, 0xc2, 0x9e, 0xa4, 0x28, - 0x51, 0x3b, 0x29, 0xa9, 0xf6, 0x3e, 0xd5, 0x2e, 0xa9, 0x4d, 0xdd, 0xcf, 0x61, 0xea, 0x31, 0x01, - 0x9f, 0xfd, 0x3e, 0xc6, 0xbc, 0xe8, 0x6e, 0x36, 0x0a, 0xdc, 0xcd, 0x33, 0x5a, 0x24, 0x25, 0xf4, - 0x3f, 0xc2, 0x08, 0x8b, 0xfa, 0x36, 0x2a, 0xaa, 0xe6, 0x4b, 0x45, 0xad, 0x0d, 0xf2, 0xf9, 0xda, - 0x13, 0x51, 0xb5, 0x00, 0x38, 0x26, 0xae, 0x9f, 0x02, 0x93, 0x31, 0x72, 0x37, 0x04, 0xa8, 0x93, - 0x56, 0xd5, 0xfa, 0xd3, 0x6b, 0xd8, 0xa5, 0xd8, 0x76, 0xf2, 0xce, 0x8e, 0xed, 0x60, 0xcc, 0xfb, - 0xb7, 0x8b, 0xcc, 0x50, 0x36, 0x99, 0xd1, 0x98, 0xb3, 0x64, 0x7c, 0x69, 0x7e, 0x97, 0x30, 0x9f, - 0xdf, 0x0c, 0x2b, 0x8a, 0xe5, 0xfd, 0xd4, 0xb3, 0x7d, 0x4c, 0x4a, 0x5b, 0xe5, 0xd1, 0x11, 0xc1, - 0x88, 0xca, 0xf9, 0x04, 0x44, 0xae, 0x26, 0x86, 0x7f, 0x73, 0x01, 0xa7, 0xec, 0xbf, 0x06, 0xd0, - 0x42, 0xb5, 0xf9, 0x45, 0x34, 0x62, 0xc2, 0xf5, 0x91, 0x8b, 0x69, 0x02, 0xf5, 0x4a, 0x8b, 0x58, - 0xbf, 0xfa, 0xed, 0x45, 0x66, 0x90, 0x4d, 0x66, 0x9c, 0xfe, 0x68, 0x62, 0x8f, 0x6f, 0x0e, 0x8f, - 0x0f, 0x06, 0xdc, 0x30, 0xe1, 0x14, 0x88, 0xd6, 0x53, 0x8f, 0x42, 0x00, 0xd7, 0xc7, 0xf1, 0x18, - 0xb6, 0x6b, 0x77, 0x59, 0x10, 0xa4, 0x20, 0x44, 0xbd, 0xda, 0x22, 0xd6, 0xef, 0xe1, 0xbf, 0x10, - 0xc0, 0xd9, 0x61, 0x57, 0x05, 0xd4, 0x1f, 0x2c, 0x56, 0x3a, 0x59, 0xae, 0x74, 0xf2, 0xbe, 0xd2, - 0xc9, 0xe3, 0x5a, 0x57, 0x96, 0x6b, 0x5d, 0x79, 0x5d, 0xeb, 0xca, 0xdd, 0xc5, 0xde, 0x8d, 0x39, - 0x4c, 0x65, 0x8a, 0xbc, 0x83, 0x69, 0xb4, 0x8b, 0xe9, 0xec, 0x9c, 0x3e, 0x1c, 0xfe, 0x87, 0x7c, - 0x0b, 0x5e, 0x2d, 0x7f, 0x98, 0xb3, 0x8f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb8, 0xfe, 0x4d, 0x2d, - 0x34, 0x02, 0x00, 0x00, + proto.RegisterType((*HookWhitelist)(nil), "osmosis.tokenfactory.HookWhitelist") + proto.RegisterType((*Params)(nil), "osmosis.tokenfactory.Params") +} + +func init() { proto.RegisterFile("osmosis/tokenfactory/params.proto", fileDescriptor_09c297db7c49d1cf) } + +var fileDescriptor_09c297db7c49d1cf = []byte{ + // 456 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x52, 0xb1, 0x8e, 0xd3, 0x40, + 0x10, 0x8d, 0x49, 0x14, 0xc4, 0xc2, 0x49, 0x87, 0x39, 0x84, 0x93, 0xc2, 0xce, 0x39, 0x4d, 0x28, + 0xce, 0xd6, 0x1d, 0x88, 0x82, 0x8e, 0x18, 0x01, 0x57, 0x20, 0x45, 0x6e, 0x10, 0x34, 0xd6, 0xc6, + 0x3b, 0x76, 0x56, 0x89, 0x77, 0x22, 0xef, 0xe6, 0x20, 0x5f, 0x01, 0x15, 0x1f, 0xc1, 0x97, 0xa4, + 0xbc, 0x92, 0xca, 0xa0, 0xe4, 0x0f, 0xee, 0x0b, 0x90, 0xd7, 0x8e, 0x70, 0xe0, 0x2a, 0xef, 0xbc, + 0x37, 0x33, 0x9e, 0xf7, 0x66, 0xc8, 0x29, 0xca, 0x0c, 0x25, 0x97, 0xbe, 0xc2, 0x39, 0x88, 0x84, + 0xc6, 0x0a, 0xf3, 0xb5, 0xbf, 0xa4, 0x39, 0xcd, 0xa4, 0xb7, 0xcc, 0x51, 0xa1, 0x79, 0x52, 0xa7, + 0x78, 0xcd, 0x94, 0xbe, 0x1d, 0x6b, 0xd8, 0x9f, 0x52, 0x09, 0xfe, 0xd5, 0xf9, 0x14, 0x14, 0x3d, + 0xf7, 0x63, 0xe4, 0xa2, 0xaa, 0xea, 0xf7, 0x2a, 0x3e, 0xd2, 0x91, 0x5f, 0x05, 0x35, 0x75, 0x92, + 0x62, 0x8a, 0x15, 0x5e, 0xbe, 0x2a, 0xd4, 0xfd, 0x48, 0x8e, 0xde, 0x21, 0xce, 0x3f, 0xcc, 0xb8, + 0x82, 0x05, 0x97, 0xca, 0x1c, 0x92, 0xbb, 0x31, 0x32, 0x88, 0x38, 0xb3, 0x8c, 0x81, 0x31, 0xea, + 0x8c, 0xc9, 0xb6, 0x70, 0xba, 0x01, 0x32, 0xb8, 0x7c, 0x1d, 0x76, 0x4b, 0xea, 0x92, 0x99, 0x43, + 0x72, 0xc4, 0x40, 0x60, 0x16, 0xc5, 0x39, 0x50, 0x85, 0xb9, 0x75, 0x67, 0x60, 0x8c, 0xee, 0x85, + 0x0f, 0x34, 0x18, 0x54, 0x98, 0xfb, 0xb5, 0x4d, 0xba, 0x13, 0x2d, 0xc9, 0xfc, 0x6e, 0x10, 0xb3, + 0x51, 0xc0, 0x51, 0x44, 0x09, 0x80, 0x65, 0x0c, 0xda, 0xa3, 0xfb, 0x17, 0x3d, 0xaf, 0x9e, 0xb3, + 0x14, 0xe5, 0xd5, 0xa2, 0xbc, 0x00, 0xb9, 0x18, 0xbf, 0xdf, 0x14, 0x4e, 0xeb, 0xa6, 0x70, 0x7a, + 0x6b, 0x9a, 0x2d, 0x5e, 0xba, 0xff, 0xb7, 0x70, 0x7f, 0xfc, 0x72, 0x46, 0x29, 0x57, 0xb3, 0xd5, + 0xd4, 0x8b, 0x31, 0xab, 0x15, 0xd7, 0x9f, 0x33, 0xc9, 0xe6, 0xbe, 0x5a, 0x2f, 0x41, 0xea, 0x6e, + 0x32, 0x3c, 0xfe, 0x3b, 0x1f, 0x47, 0xf1, 0x06, 0xc0, 0x4c, 0x48, 0xff, 0x9f, 0xa6, 0x29, 0x95, + 0x51, 0x8c, 0x42, 0xae, 0x32, 0xd0, 0xaa, 0x3a, 0xe3, 0xa7, 0x9b, 0xc2, 0x31, 0x6e, 0x0a, 0xe7, + 0xf4, 0xd6, 0x21, 0x1a, 0xf9, 0x6e, 0xf8, 0xe4, 0xe0, 0x07, 0x6f, 0xa9, 0x0c, 0x2a, 0xc6, 0xbc, + 0x20, 0x8f, 0x13, 0x80, 0x28, 0xc6, 0xc5, 0x02, 0xca, 0x4d, 0x46, 0x94, 0xb1, 0x1c, 0xa4, 0xb4, + 0xda, 0xda, 0xb8, 0x47, 0x09, 0x40, 0xb0, 0xe7, 0x5e, 0x55, 0x94, 0x39, 0x21, 0x0f, 0x3f, 0xef, + 0xd7, 0x02, 0x2c, 0x9a, 0x21, 0xce, 0xa5, 0xd5, 0xd1, 0x96, 0x0d, 0xbd, 0xdb, 0xae, 0xc3, 0x3b, + 0xd8, 0x64, 0x78, 0xdc, 0xa8, 0x2e, 0x19, 0x39, 0x9e, 0x6c, 0xb6, 0xb6, 0x71, 0xbd, 0xb5, 0x8d, + 0xdf, 0x5b, 0xdb, 0xf8, 0xb6, 0xb3, 0x5b, 0xd7, 0x3b, 0xbb, 0xf5, 0x73, 0x67, 0xb7, 0x3e, 0xbd, + 0x68, 0x78, 0x28, 0x60, 0xa5, 0x72, 0x14, 0x67, 0x98, 0xa7, 0xfb, 0xb7, 0x7f, 0xf5, 0xdc, 0xff, + 0x72, 0x78, 0xac, 0xda, 0xd7, 0x69, 0x57, 0x5f, 0xd1, 0xb3, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, + 0x1d, 0x23, 0x36, 0x33, 0xd1, 0x02, 0x00, 0x00, +} + +func (m *HookWhitelist) 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 *HookWhitelist) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *HookWhitelist) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.DenomCreator) > 0 { + i -= len(m.DenomCreator) + copy(dAtA[i:], m.DenomCreator) + i = encodeVarintParams(dAtA, i, uint64(len(m.DenomCreator))) + i-- + dAtA[i] = 0x12 + } + if m.CodeID != 0 { + i = encodeVarintParams(dAtA, i, uint64(m.CodeID)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil } func (m *Params) Marshal() (dAtA []byte, err error) { @@ -153,6 +252,20 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.WhitelistedHooks) > 0 { + for iNdEx := len(m.WhitelistedHooks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.WhitelistedHooks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintParams(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } if len(m.FeeCollectorAddress) > 0 { i -= len(m.FeeCollectorAddress) copy(dAtA[i:], m.FeeCollectorAddress) @@ -193,6 +306,22 @@ func encodeVarintParams(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } +func (m *HookWhitelist) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.CodeID != 0 { + n += 1 + sovParams(uint64(m.CodeID)) + } + l = len(m.DenomCreator) + if l > 0 { + n += 1 + l + sovParams(uint64(l)) + } + return n +} + func (m *Params) Size() (n int) { if m == nil { return 0 @@ -212,6 +341,12 @@ func (m *Params) Size() (n int) { if l > 0 { n += 1 + l + sovParams(uint64(l)) } + if len(m.WhitelistedHooks) > 0 { + for _, e := range m.WhitelistedHooks { + l = e.Size() + n += 1 + l + sovParams(uint64(l)) + } + } return n } @@ -221,6 +356,107 @@ func sovParams(x uint64) (n int) { func sozParams(x uint64) (n int) { return sovParams(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } +func (m *HookWhitelist) 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 ErrIntOverflowParams + } + 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: HookWhitelist: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: HookWhitelist: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CodeID", wireType) + } + m.CodeID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowParams + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CodeID |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DenomCreator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowParams + } + 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 ErrInvalidLengthParams + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthParams + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DenomCreator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipParams(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthParams + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Params) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -335,6 +571,40 @@ func (m *Params) Unmarshal(dAtA []byte) error { } m.FeeCollectorAddress = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field WhitelistedHooks", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowParams + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthParams + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthParams + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.WhitelistedHooks = append(m.WhitelistedHooks, &HookWhitelist{}) + if err := m.WhitelistedHooks[len(m.WhitelistedHooks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipParams(dAtA[iNdEx:]) diff --git a/x/tokenfactory/types/query.pb.go b/x/tokenfactory/types/query.pb.go index 2e62dcd7f..3d6b122ff 100644 --- a/x/tokenfactory/types/query.pb.go +++ b/x/tokenfactory/types/query.pb.go @@ -419,50 +419,50 @@ func init() { } var fileDescriptor_6f22013ad0f72e3f = []byte{ - // 673 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x95, 0xcf, 0x4f, 0x13, 0x41, - 0x14, 0xc7, 0x3b, 0xa8, 0x55, 0x46, 0xd1, 0x30, 0xa0, 0xc1, 0x06, 0xb7, 0x32, 0x12, 0x03, 0x09, - 0x76, 0x04, 0x89, 0x07, 0x91, 0x08, 0x8b, 0x31, 0x26, 0x86, 0x04, 0x57, 0x62, 0x22, 0x31, 0x69, - 0xa6, 0xdd, 0xa1, 0x34, 0xb0, 0xfb, 0xca, 0xcc, 0x94, 0xd8, 0x10, 0x2e, 0x98, 0x78, 0x36, 0xf1, - 0xe8, 0xff, 0xe0, 0xdf, 0xc1, 0x91, 0x84, 0x8b, 0xa7, 0xc6, 0x80, 0x7f, 0x41, 0x0f, 0x5e, 0xbc, - 0x98, 0xce, 0xce, 0xf2, 0xc3, 0x96, 0x4d, 0x85, 0xc4, 0xdb, 0x76, 0xe6, 0xbd, 0xef, 0xfb, 0x7e, - 0xe6, 0xbd, 0x97, 0xe2, 0x11, 0x50, 0x01, 0xa8, 0xb2, 0x62, 0x1a, 0x56, 0x45, 0xb8, 0xcc, 0x8b, - 0x1a, 0x64, 0x8d, 0x6d, 0x8c, 0x17, 0x84, 0xe6, 0xe3, 0x6c, 0xbd, 0x2a, 0x64, 0x2d, 0x57, 0x91, - 0xa0, 0x81, 0x0c, 0xda, 0xc8, 0xdc, 0xf1, 0xc8, 0x9c, 0x8d, 0xcc, 0xf4, 0x97, 0xa0, 0x04, 0x26, - 0x90, 0x35, 0xbf, 0xa2, 0x9c, 0xcc, 0x60, 0x09, 0xa0, 0xb4, 0x26, 0x18, 0xaf, 0x94, 0x19, 0x0f, - 0x43, 0xd0, 0x5c, 0x97, 0x21, 0x54, 0xf6, 0x76, 0x32, 0xb1, 0x36, 0xaf, 0xea, 0x15, 0x90, 0x65, - 0x5d, 0x9b, 0x17, 0x9a, 0xfb, 0x5c, 0x73, 0x9b, 0x35, 0x9a, 0x98, 0x55, 0xe1, 0x92, 0x07, 0xb6, - 0x00, 0xed, 0xc7, 0xe4, 0x75, 0x93, 0x60, 0xc1, 0x1c, 0x7a, 0x62, 0xbd, 0x2a, 0x94, 0xa6, 0xef, - 0x70, 0xdf, 0x89, 0x53, 0x55, 0x81, 0x50, 0x09, 0xe2, 0xe2, 0x74, 0x94, 0x3c, 0x80, 0xee, 0xa2, - 0x91, 0xab, 0x13, 0xc3, 0xb9, 0x24, 0xe0, 0x5c, 0x94, 0xed, 0x5e, 0xdc, 0xa9, 0x67, 0x53, 0x9e, - 0xcd, 0xa4, 0x1f, 0x11, 0xa6, 0x46, 0xfb, 0xb9, 0x08, 0x21, 0x98, 0xfd, 0x9b, 0xc0, 0x3a, 0x20, - 0x63, 0xf8, 0x72, 0x51, 0x0a, 0xae, 0x41, 0x9a, 0x5a, 0xdd, 0x2e, 0x69, 0xd4, 0xb3, 0xd7, 0x6b, - 0x3c, 0x58, 0x7b, 0x42, 0xed, 0x05, 0xf5, 0xe2, 0x10, 0xc2, 0xf0, 0x15, 0x55, 0x2d, 0xf8, 0x4d, - 0xc5, 0x81, 0x2e, 0x13, 0xde, 0xd7, 0xa8, 0x67, 0x6f, 0x44, 0xe1, 0xf1, 0x0d, 0xf5, 0x0e, 0x83, - 0xe8, 0x37, 0x84, 0xef, 0x25, 0xba, 0xb0, 0xc4, 0x9f, 0x10, 0x26, 0x87, 0xaf, 0x9c, 0x0f, 0xec, - 0xb5, 0xc5, 0x9f, 0x4c, 0xc6, 0x6f, 0x2f, 0xed, 0x0e, 0x35, 0x9f, 0xa3, 0x51, 0xcf, 0xde, 0x8e, - 0xdc, 0xb5, 0xaa, 0x53, 0xaf, 0xb7, 0xa5, 0xb1, 0x74, 0x1e, 0xdf, 0x39, 0xf2, 0xab, 0x5e, 0x48, - 0x08, 0xe6, 0x22, 0xf6, 0x33, 0x3d, 0x18, 0x7d, 0x85, 0x9d, 0xd3, 0xe4, 0x2c, 0xf9, 0x28, 0x4e, - 0x9b, 0xa7, 0x6a, 0xf6, 0xfa, 0xc2, 0x48, 0xb7, 0xdb, 0xdb, 0xa8, 0x67, 0x7b, 0x22, 0xb9, 0xe8, - 0x9c, 0x7a, 0x36, 0x80, 0x6e, 0x23, 0x3c, 0x64, 0xd4, 0x5c, 0xb1, 0x0c, 0x52, 0xbc, 0x11, 0xa1, - 0xff, 0x12, 0x60, 0x75, 0xd6, 0xf7, 0xa5, 0x50, 0xea, 0x3f, 0x75, 0xb4, 0x68, 0xc7, 0xea, 0x14, - 0x0f, 0x96, 0x6a, 0x1a, 0xf7, 0x14, 0x21, 0xd4, 0x92, 0x17, 0x75, 0x9e, 0xfb, 0x7e, 0x6c, 0x65, - 0xa0, 0x51, 0xcf, 0xf6, 0x5b, 0x2b, 0xc7, 0xaf, 0xa9, 0x77, 0x2d, 0xfe, 0xdd, 0x54, 0x9a, 0x68, - 0xa4, 0xf1, 0x25, 0x53, 0x85, 0x7c, 0x45, 0x38, 0x1d, 0xcd, 0x37, 0x79, 0x98, 0x3c, 0x06, 0xad, - 0xeb, 0x95, 0x19, 0xff, 0x87, 0x8c, 0xc8, 0x38, 0x1d, 0xdb, 0xde, 0xfb, 0xf9, 0xa5, 0xeb, 0x3e, - 0x19, 0x66, 0x1d, 0xec, 0x36, 0xf9, 0x8d, 0xf0, 0xad, 0xf6, 0xe3, 0x47, 0x66, 0x3a, 0xa8, 0x9d, - 0xb8, 0x9a, 0x99, 0xd9, 0x73, 0x28, 0x58, 0x9a, 0xf7, 0x86, 0xe6, 0x2d, 0x59, 0x4c, 0xa6, 0x89, - 0xe6, 0x8b, 0xc5, 0xc7, 0x9b, 0x76, 0x38, 0xb6, 0xd8, 0x66, 0xdc, 0xf6, 0x2d, 0xd6, 0xba, 0x3f, - 0x64, 0x0f, 0xe1, 0xde, 0x96, 0xc1, 0x26, 0x53, 0x9d, 0xda, 0x6e, 0xb3, 0x5d, 0x99, 0xa7, 0x67, - 0x4b, 0xb6, 0xb8, 0x73, 0x06, 0x77, 0x9a, 0x4c, 0x75, 0x82, 0x9b, 0x5f, 0x96, 0x10, 0xe4, 0x2d, - 0xea, 0x11, 0x33, 0xf9, 0x85, 0xf0, 0xcd, 0xb6, 0xc3, 0x4d, 0x9e, 0x75, 0x60, 0x2e, 0x69, 0x35, - 0x33, 0x33, 0x67, 0x17, 0xb0, 0x84, 0x4b, 0x86, 0x70, 0x91, 0x78, 0xe7, 0x6f, 0x68, 0xc1, 0x14, - 0xca, 0x2b, 0x11, 0xfa, 0xf9, 0x15, 0x80, 0x55, 0x77, 0x61, 0x67, 0xdf, 0x41, 0xbb, 0xfb, 0x0e, - 0xfa, 0xb1, 0xef, 0xa0, 0xcf, 0x07, 0x4e, 0x6a, 0xf7, 0xc0, 0x49, 0x7d, 0x3f, 0x70, 0x52, 0x4b, - 0x8f, 0x4b, 0x65, 0xbd, 0x52, 0x2d, 0xe4, 0x8a, 0x10, 0xb0, 0x50, 0x54, 0xb5, 0x84, 0xf0, 0x01, - 0xc8, 0x52, 0xfc, 0xcd, 0x36, 0x26, 0xd9, 0x87, 0x93, 0x46, 0x74, 0xad, 0x22, 0x54, 0x21, 0x6d, - 0xfe, 0xfb, 0x1e, 0xfd, 0x09, 0x00, 0x00, 0xff, 0xff, 0xca, 0x76, 0xec, 0xdc, 0xda, 0x07, 0x00, - 0x00, + // 677 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0x4f, 0x4f, 0x13, 0x4f, + 0x18, 0xee, 0xf2, 0xfb, 0x59, 0x65, 0x14, 0x0d, 0x03, 0x1a, 0x6c, 0x70, 0x2b, 0xa3, 0x31, 0x98, + 0xe0, 0x8e, 0x20, 0xf1, 0x00, 0x12, 0xa1, 0x18, 0x63, 0x62, 0x48, 0x60, 0x25, 0x1e, 0x88, 0x49, + 0x33, 0xed, 0x0e, 0xa5, 0x81, 0xdd, 0xb7, 0xcc, 0x4c, 0x89, 0x0d, 0xe1, 0x82, 0x89, 0x67, 0x13, + 0x8f, 0x7e, 0x07, 0x3f, 0x07, 0x47, 0x12, 0x2e, 0x9e, 0x1a, 0x03, 0x7e, 0x82, 0x1e, 0xbc, 0x78, + 0x31, 0x9d, 0x99, 0xe5, 0x8f, 0x2d, 0x9b, 0x5a, 0x12, 0x6f, 0xdb, 0x79, 0x9f, 0xf7, 0x79, 0x9f, + 0xe7, 0xfd, 0x93, 0xa2, 0x51, 0x90, 0x21, 0xc8, 0xb2, 0xa4, 0x0a, 0xd6, 0x79, 0xb4, 0xca, 0x8a, + 0x0a, 0x44, 0x8d, 0x6e, 0x8d, 0x17, 0xb8, 0x62, 0xe3, 0x74, 0xb3, 0xca, 0x45, 0xcd, 0xab, 0x08, + 0x50, 0x80, 0x87, 0x2d, 0xd2, 0x3b, 0x8d, 0xf4, 0x2c, 0x32, 0x33, 0x58, 0x82, 0x12, 0x68, 0x20, + 0x6d, 0x7e, 0x99, 0x9c, 0xcc, 0x70, 0x09, 0xa0, 0xb4, 0xc1, 0x29, 0xab, 0x94, 0x29, 0x8b, 0x22, + 0x50, 0x4c, 0x95, 0x21, 0x92, 0x36, 0x3a, 0xd2, 0xb6, 0x76, 0x85, 0x09, 0x16, 0xc6, 0x90, 0xc9, + 0x44, 0x79, 0xac, 0xaa, 0xd6, 0x40, 0x94, 0x55, 0x6d, 0x81, 0x2b, 0x16, 0x30, 0xc5, 0x4c, 0x16, + 0x19, 0x44, 0x78, 0xa9, 0xa9, 0x7c, 0x51, 0x53, 0xf9, 0x7c, 0xb3, 0xca, 0xa5, 0x22, 0x4b, 0x68, + 0xe0, 0xcc, 0xab, 0xac, 0x40, 0x24, 0x39, 0x9e, 0x42, 0x69, 0x53, 0x72, 0xc8, 0xb9, 0xeb, 0x8c, + 0x5e, 0x9d, 0x18, 0xf6, 0xda, 0x1a, 0x35, 0x59, 0xb9, 0xff, 0xf7, 0xea, 0xd9, 0x94, 0x6f, 0x33, + 0xc8, 0x07, 0x07, 0x11, 0xcd, 0xf9, 0x82, 0x47, 0x10, 0xce, 0xfd, 0x29, 0xc7, 0x56, 0xc6, 0x63, + 0xe8, 0x72, 0x51, 0x70, 0xa6, 0x40, 0xe8, 0x1a, 0xbd, 0x39, 0xdc, 0xa8, 0x67, 0xaf, 0xd7, 0x58, + 0xb8, 0x31, 0x45, 0x6c, 0x80, 0xf8, 0x31, 0x04, 0x53, 0x74, 0x45, 0x56, 0x0b, 0x41, 0x93, 0x71, + 0xa8, 0x47, 0xc3, 0x07, 0x1a, 0xf5, 0xec, 0x0d, 0x03, 0x8f, 0x23, 0xc4, 0x3f, 0x06, 0x91, 0xaf, + 0x0e, 0xba, 0x97, 0xa8, 0xc2, 0x3a, 0xfd, 0xe8, 0x20, 0x7c, 0xdc, 0xb2, 0x7c, 0x68, 0xc3, 0xd6, + 0xf6, 0xa4, 0x97, 0x34, 0x5f, 0xaf, 0x3d, 0x75, 0x6e, 0xa4, 0xd9, 0x8e, 0x46, 0x3d, 0x7b, 0xdb, + 0xa8, 0x6b, 0x65, 0x27, 0x7e, 0x7f, 0xcb, 0x94, 0xc8, 0x02, 0xba, 0x73, 0xa2, 0x57, 0xbe, 0x14, + 0x10, 0xce, 0x1b, 0xef, 0x5d, 0x35, 0x8c, 0xbc, 0x46, 0xee, 0x79, 0x74, 0xd6, 0xf9, 0x43, 0x94, + 0xd6, 0xad, 0x6a, 0xce, 0xf8, 0xbf, 0xd1, 0xde, 0x5c, 0x7f, 0xa3, 0x9e, 0xed, 0x33, 0x74, 0xe6, + 0x9d, 0xf8, 0x16, 0x40, 0x76, 0x1d, 0x34, 0xa2, 0xd9, 0x72, 0x7c, 0x15, 0x04, 0x7f, 0xc3, 0xa3, + 0xe0, 0x15, 0xc0, 0xfa, 0x5c, 0x10, 0x08, 0x2e, 0xe5, 0x3f, 0x9a, 0x68, 0xd1, 0xae, 0xd5, 0x39, + 0x1a, 0xac, 0xab, 0x19, 0xd4, 0x57, 0x84, 0x48, 0x09, 0x56, 0x54, 0x79, 0x16, 0x04, 0xb1, 0x94, + 0xa1, 0x46, 0x3d, 0x3b, 0x68, 0xa5, 0x9c, 0x0e, 0x13, 0xff, 0x5a, 0xfc, 0xbb, 0xc9, 0x34, 0xd1, + 0x48, 0xa3, 0x4b, 0xba, 0x0a, 0xfe, 0xe2, 0xa0, 0xb4, 0xd9, 0x6f, 0xfc, 0x38, 0x79, 0x0d, 0x5a, + 0xcf, 0x2a, 0x33, 0xfe, 0x17, 0x19, 0x46, 0x38, 0x19, 0xdb, 0x3d, 0xf8, 0xf1, 0xb9, 0xe7, 0x01, + 0xbe, 0x4f, 0x13, 0xcf, 0xdb, 0x1c, 0x19, 0xfe, 0xe5, 0xa0, 0x5b, 0xed, 0xd7, 0x0f, 0xcf, 0x76, + 0x50, 0x3b, 0xf1, 0x34, 0x33, 0x73, 0x17, 0x60, 0xb0, 0x6e, 0xde, 0x69, 0x37, 0x6f, 0xf1, 0x72, + 0xb2, 0x1b, 0xb3, 0x5f, 0x34, 0x7e, 0xde, 0xb6, 0xcb, 0xb1, 0x43, 0xb7, 0xe3, 0xb1, 0xef, 0xd0, + 0xd6, 0xfb, 0xc1, 0x07, 0x0e, 0xea, 0x6f, 0x59, 0x6c, 0x3c, 0xdd, 0xa9, 0xec, 0x36, 0xd7, 0x95, + 0x79, 0xd6, 0x5d, 0xb2, 0xb5, 0x3b, 0xaf, 0xed, 0xce, 0xe0, 0xe9, 0x4e, 0xec, 0xe6, 0x57, 0x05, + 0x84, 0x79, 0x6b, 0xf5, 0xc4, 0x33, 0xfe, 0xe9, 0xa0, 0x9b, 0x6d, 0x97, 0x1b, 0x3f, 0xef, 0x40, + 0x5c, 0xd2, 0x69, 0x66, 0x66, 0xbb, 0x27, 0xb0, 0x0e, 0x57, 0xb4, 0xc3, 0x65, 0xec, 0x5f, 0x7c, + 0xa0, 0x05, 0x5d, 0x28, 0x2f, 0x79, 0x14, 0xe4, 0xd7, 0x00, 0xd6, 0x73, 0x8b, 0x7b, 0x87, 0xae, + 0xb3, 0x7f, 0xe8, 0x3a, 0xdf, 0x0f, 0x5d, 0xe7, 0xd3, 0x91, 0x9b, 0xda, 0x3f, 0x72, 0x53, 0xdf, + 0x8e, 0xdc, 0xd4, 0xca, 0xd3, 0x52, 0x59, 0xad, 0x55, 0x0b, 0x5e, 0x11, 0x42, 0x1a, 0xf1, 0xaa, + 0x12, 0x10, 0x3d, 0x02, 0x51, 0x8a, 0xbf, 0xe9, 0xd6, 0x24, 0x7d, 0x7f, 0x56, 0x88, 0xaa, 0x55, + 0xb8, 0x2c, 0xa4, 0xf5, 0x7f, 0xde, 0x93, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x7f, 0xf0, 0xc4, + 0xcf, 0xca, 0x07, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/tokenfactory/types/tx.go b/x/tokenfactory/types/tx.go index b453ddb2f..3925b0b5a 100644 --- a/x/tokenfactory/types/tx.go +++ b/x/tokenfactory/types/tx.go @@ -32,9 +32,5 @@ func (msg *MsgUpdateParams) Validate() error { return errorsmod.Wrap(err, "authority is invalid") } - if _, err := sdk.AccAddressFromBech32(msg.Params.FeeCollectorAddress); err != nil { - return errorsmod.Wrap(err, "fee_collector_address is invalid") - } - - return nil + return msg.Params.Validate() } diff --git a/x/tokenfactory/types/tx.pb.go b/x/tokenfactory/types/tx.pb.go index 9e48c15bd..236c58ed4 100644 --- a/x/tokenfactory/types/tx.pb.go +++ b/x/tokenfactory/types/tx.pb.go @@ -857,74 +857,74 @@ func init() { } var fileDescriptor_283b6c9a90a846b4 = []byte{ - // 1062 bytes of a gzipped FileDescriptorProto + // 1064 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x57, 0xcf, 0x6f, 0x1b, 0x45, - 0x14, 0xce, 0xf6, 0x47, 0xda, 0x4c, 0x12, 0x92, 0x6c, 0x42, 0xe3, 0x2c, 0xa9, 0xb7, 0x2c, 0x14, - 0x35, 0x11, 0xf6, 0xca, 0x69, 0x88, 0xc0, 0x12, 0x12, 0x75, 0x51, 0xe8, 0x01, 0x4b, 0xd5, 0x26, - 0x5c, 0x50, 0x25, 0x6b, 0x6c, 0x4f, 0xd6, 0x2b, 0xb3, 0x33, 0xee, 0xcc, 0x38, 0x69, 0x6e, 0x15, - 0xdc, 0x38, 0xf1, 0x1f, 0x20, 0x2e, 0x88, 0x63, 0x0e, 0xfc, 0x11, 0xe1, 0x56, 0x71, 0xe2, 0xb4, - 0x42, 0xc9, 0x21, 0x07, 0x4e, 0xf8, 0x2f, 0x40, 0xf3, 0x63, 0xd7, 0xde, 0xb5, 0x15, 0xdb, 0x07, - 0xd4, 0x4b, 0xe2, 0x9d, 0xf7, 0x7d, 0x6f, 0xdf, 0xf7, 0xcd, 0x9b, 0x37, 0x36, 0x78, 0x48, 0x58, - 0x48, 0x58, 0xc0, 0x5c, 0x4e, 0xda, 0x08, 0x1f, 0xc1, 0x06, 0x27, 0xf4, 0xd4, 0x3d, 0x2e, 0xd5, - 0x11, 0x87, 0x25, 0x97, 0xbf, 0x2a, 0x76, 0x28, 0xe1, 0xc4, 0xdc, 0xd4, 0xb0, 0xe2, 0x20, 0xac, - 0xa8, 0x61, 0xd6, 0x0a, 0x0c, 0x03, 0x4c, 0x5c, 0xf9, 0x57, 0x11, 0xac, 0x7c, 0x43, 0x32, 0xdc, - 0x3a, 0xc4, 0xed, 0x24, 0x9d, 0x78, 0x18, 0x8a, 0x33, 0x94, 0xc4, 0x1b, 0x24, 0xc0, 0x3a, 0xbe, - 0xae, 0xe3, 0x21, 0xf3, 0xdd, 0xe3, 0x92, 0xf8, 0xa7, 0x03, 0x1b, 0x2a, 0x50, 0x93, 0x4f, 0xae, - 0x7a, 0xd0, 0xa1, 0x35, 0x9f, 0xf8, 0x44, 0xad, 0x8b, 0x4f, 0x7a, 0x75, 0xeb, 0x5a, 0x85, 0x1d, - 0x48, 0x61, 0xa8, 0x13, 0x38, 0x3f, 0x1b, 0xe0, 0x9d, 0x2a, 0xf3, 0x9f, 0x52, 0x04, 0x39, 0xfa, - 0x12, 0x61, 0x12, 0x9a, 0x5b, 0x60, 0x96, 0x21, 0xdc, 0x44, 0x34, 0x67, 0x3c, 0x30, 0x1e, 0xcd, - 0x55, 0x56, 0x7a, 0x91, 0xbd, 0x78, 0x0a, 0xc3, 0xef, 0xca, 0x8e, 0x5a, 0x77, 0x3c, 0x0d, 0x30, - 0x5d, 0x70, 0x97, 0x75, 0xeb, 0x4d, 0x41, 0xcb, 0xdd, 0x90, 0xe0, 0xd5, 0x5e, 0x64, 0x2f, 0x69, - 0xb0, 0x8e, 0x38, 0x5e, 0x02, 0x2a, 0x97, 0xbe, 0xbf, 0x3a, 0xdb, 0xd6, 0xec, 0x1f, 0xaf, 0xce, - 0xb6, 0xdf, 0x1f, 0x59, 0x69, 0x43, 0x56, 0x53, 0x50, 0xec, 0x17, 0xe0, 0x5e, 0xba, 0x40, 0x0f, - 0xb1, 0x0e, 0xc1, 0x0c, 0x99, 0x15, 0xb0, 0x84, 0xd1, 0x49, 0x4d, 0x52, 0x6b, 0xaa, 0x08, 0x55, - 0xb1, 0xd5, 0x8b, 0xec, 0x7b, 0xaa, 0x88, 0x0c, 0xc0, 0xf1, 0x16, 0x31, 0x3a, 0x39, 0x14, 0x0b, - 0x32, 0x97, 0xf3, 0x8f, 0x01, 0xee, 0x54, 0x99, 0x5f, 0x0d, 0x30, 0x9f, 0x46, 0xf8, 0x33, 0x30, - 0x0b, 0x43, 0xd2, 0xc5, 0x5c, 0xca, 0x9e, 0xdf, 0xd9, 0x28, 0xea, 0x6d, 0x11, 0x9b, 0x1b, 0x37, - 0x49, 0xf1, 0x29, 0x09, 0x70, 0xe5, 0xdd, 0xf3, 0xc8, 0x9e, 0xe9, 0x67, 0x52, 0x34, 0xc7, 0xd3, - 0x7c, 0xf3, 0x0b, 0xb0, 0x18, 0x06, 0x98, 0x1f, 0x92, 0x27, 0xcd, 0x26, 0x45, 0x8c, 0xe5, 0x6e, - 0x66, 0x25, 0x88, 0x70, 0x8d, 0x93, 0x1a, 0x54, 0x00, 0xc7, 0x4b, 0x13, 0xca, 0x5b, 0x19, 0x4f, - 0x37, 0x46, 0x7a, 0x2a, 0x38, 0xce, 0x0a, 0x58, 0xd2, 0x62, 0x63, 0x13, 0x9d, 0x7f, 0x95, 0x01, - 0x95, 0x2e, 0xc5, 0x6f, 0xc7, 0x80, 0x7d, 0xb0, 0x54, 0xef, 0x52, 0xbc, 0x4f, 0x49, 0x98, 0xb6, - 0x60, 0xb3, 0x17, 0xd9, 0x39, 0xc5, 0x11, 0x80, 0xda, 0x11, 0x25, 0x61, 0xdf, 0x84, 0x2c, 0x69, - 0x42, 0x1b, 0x04, 0x4b, 0xdb, 0x20, 0x24, 0x27, 0x36, 0xfc, 0xa1, 0xcf, 0x41, 0x0b, 0x62, 0x1f, - 0x3d, 0x69, 0x86, 0xc1, 0x54, 0x6e, 0x7c, 0x04, 0x6e, 0x0f, 0x1e, 0x82, 0xe5, 0x5e, 0x64, 0x2f, - 0x28, 0xa4, 0xee, 0x3a, 0x15, 0x36, 0x4b, 0x60, 0x4e, 0x34, 0x24, 0x14, 0xf9, 0xb5, 0xca, 0xb5, - 0x5e, 0x64, 0x2f, 0xf7, 0x7b, 0x55, 0x86, 0x1c, 0xef, 0x2e, 0x46, 0x27, 0xb2, 0x8a, 0x49, 0x4f, - 0x8c, 0xac, 0xbb, 0xa0, 0xd8, 0x39, 0x75, 0x62, 0xfa, 0x52, 0x12, 0x95, 0x17, 0x06, 0x58, 0xab, - 0x32, 0xff, 0x00, 0xf1, 0x0a, 0x3a, 0x22, 0x14, 0x1d, 0x20, 0xdc, 0x7c, 0x46, 0x48, 0xfb, 0xff, - 0xd0, 0xfa, 0x39, 0x58, 0x6c, 0x10, 0xcc, 0x29, 0x6c, 0x70, 0xb9, 0x6b, 0x5a, 0x6f, 0xae, 0x17, - 0xd9, 0x6b, 0x0a, 0x9f, 0x0a, 0x3b, 0xde, 0x42, 0xfc, 0x2c, 0x76, 0xb4, 0xfc, 0x69, 0x46, 0xf7, - 0xa3, 0x91, 0xba, 0x19, 0xe2, 0x85, 0xba, 0x94, 0x22, 0x90, 0x85, 0x16, 0x21, 0x6d, 0x27, 0x0f, - 0x36, 0x47, 0x69, 0x4c, 0x4c, 0xf8, 0xc5, 0x00, 0xab, 0x0a, 0x20, 0x47, 0x40, 0x15, 0x71, 0xd8, - 0x84, 0x1c, 0x4e, 0xe3, 0x81, 0x07, 0xee, 0x86, 0x9a, 0xa6, 0xfb, 0xff, 0x7e, 0xbf, 0xff, 0x71, - 0x3b, 0xe9, 0xff, 0x38, 0x77, 0x65, 0x5d, 0x9f, 0x01, 0x3d, 0x1a, 0x63, 0xb2, 0xe3, 0x25, 0x79, - 0xca, 0xf3, 0x03, 0x82, 0x9d, 0xfb, 0xe0, 0xbd, 0x11, 0x25, 0x26, 0x12, 0xa2, 0x1b, 0x60, 0xb9, - 0xca, 0xfc, 0x7d, 0x42, 0x1b, 0xe8, 0x90, 0x42, 0xcc, 0x8e, 0x10, 0x7d, 0x3b, 0xa7, 0xd7, 0x03, - 0xab, 0x5c, 0x17, 0x30, 0x7c, 0x82, 0x1f, 0xf4, 0x22, 0x7b, 0x53, 0xf1, 0x62, 0x50, 0xe6, 0x14, - 0x8f, 0x22, 0x9b, 0x5f, 0x83, 0x95, 0x78, 0xb9, 0x3f, 0x16, 0x6f, 0xc9, 0x8c, 0xf9, 0x5e, 0x64, - 0x5b, 0x99, 0x8c, 0x83, 0xa3, 0x71, 0x98, 0x58, 0x7e, 0x9c, 0x69, 0xa4, 0x0f, 0x46, 0x36, 0xd2, - 0x91, 0xb0, 0xb2, 0x10, 0xb3, 0x1d, 0x0b, 0xe4, 0xb2, 0xfe, 0x26, 0xe6, 0x9f, 0x1b, 0x72, 0x7c, - 0x7c, 0xd3, 0x69, 0x42, 0x8e, 0x9e, 0xcb, 0xcb, 0xd4, 0xdc, 0x03, 0x73, 0xb0, 0xcb, 0x5b, 0x84, - 0x06, 0xfc, 0x54, 0xdb, 0x9f, 0xfb, 0xf3, 0xf7, 0xc2, 0x9a, 0xb6, 0x55, 0xd7, 0x72, 0xc0, 0x69, - 0x80, 0x7d, 0xaf, 0x0f, 0x35, 0xbf, 0x02, 0xb3, 0xea, 0x3a, 0xd6, 0x1b, 0xf1, 0x61, 0xf1, 0xba, - 0x6f, 0x1d, 0x45, 0xf5, 0xb6, 0xca, 0x9c, 0xd8, 0x93, 0xdf, 0xae, 0xce, 0xb6, 0x0d, 0x4f, 0xd3, - 0xcb, 0xbb, 0x42, 0x65, 0x3f, 0xb1, 0x9c, 0x14, 0x01, 0xe6, 0x88, 0x36, 0x5a, 0x30, 0xc0, 0x2f, - 0xbb, 0x88, 0x06, 0x88, 0xb9, 0x99, 0xb2, 0x9d, 0x0d, 0xb0, 0x9e, 0x59, 0x8a, 0x55, 0xee, 0xfc, - 0x7a, 0x07, 0xdc, 0xac, 0x32, 0xdf, 0x7c, 0x09, 0xe6, 0x07, 0xbf, 0x1c, 0x7c, 0x7c, 0x7d, 0x81, - 0xe9, 0x9b, 0xda, 0xda, 0x9d, 0x06, 0x9d, 0xdc, 0xeb, 0x2f, 0xc0, 0x2d, 0x79, 0x1f, 0x3f, 0x1c, - 0xcb, 0x16, 0x30, 0xab, 0x30, 0x11, 0x6c, 0x30, 0xbb, 0xbc, 0xec, 0xc6, 0x67, 0x17, 0xb0, 0x09, - 0xb2, 0x0f, 0xde, 0x23, 0xd2, 0xae, 0x81, 0x3b, 0x64, 0x02, 0xbb, 0xfa, 0xe8, 0x49, 0xec, 0x1a, - 0x1e, 0xea, 0xe6, 0x6b, 0x03, 0x2c, 0x0f, 0x0d, 0xb3, 0xd2, 0xd8, 0x54, 0x59, 0x8a, 0xf5, 0xd9, - 0xd4, 0x94, 0xa4, 0x84, 0x1f, 0x0c, 0xb0, 0x32, 0x7c, 0xa9, 0xec, 0x4c, 0x92, 0x30, 0xcd, 0xb1, - 0xca, 0xd3, 0x73, 0x92, 0x2a, 0x4e, 0xc0, 0x62, 0x7a, 0x22, 0x16, 0xc7, 0x26, 0x4b, 0xe1, 0xad, - 0xbd, 0xe9, 0xf0, 0xc9, 0x8b, 0x39, 0x58, 0x48, 0x4d, 0x83, 0xf1, 0x3d, 0x33, 0x08, 0xb7, 0x3e, - 0x99, 0x0a, 0x1e, 0xbf, 0xd5, 0xba, 0xfd, 0x5a, 0x4c, 0x80, 0xca, 0xf3, 0xf3, 0x8b, 0xbc, 0xf1, - 0xe6, 0x22, 0x6f, 0xfc, 0x7d, 0x91, 0x37, 0x7e, 0xba, 0xcc, 0xcf, 0xbc, 0xb9, 0xcc, 0xcf, 0xfc, - 0x75, 0x99, 0x9f, 0xf9, 0x76, 0xcf, 0x0f, 0x78, 0xab, 0x5b, 0x2f, 0x36, 0x48, 0xe8, 0x62, 0xd4, - 0xe5, 0x94, 0xe0, 0x02, 0xa1, 0x7e, 0xfc, 0xd9, 0x3d, 0xde, 0x75, 0x5f, 0xa5, 0xa7, 0x20, 0x3f, - 0xed, 0x20, 0x56, 0x9f, 0x95, 0x3f, 0x0d, 0x1e, 0xff, 0x17, 0x00, 0x00, 0xff, 0xff, 0x09, 0x23, - 0x7c, 0x64, 0x29, 0x0d, 0x00, 0x00, + 0x14, 0xce, 0xf6, 0x47, 0x9a, 0x4c, 0x12, 0x92, 0x6c, 0x42, 0xe3, 0x2c, 0xa9, 0xb7, 0x2c, 0x2a, + 0x6a, 0x23, 0xbc, 0x2b, 0xa7, 0x21, 0x02, 0x4b, 0x08, 0xea, 0xa2, 0xa8, 0x07, 0x2c, 0x55, 0x9b, + 0x70, 0x41, 0x95, 0xac, 0xb1, 0x3d, 0xd9, 0xac, 0xcc, 0xce, 0xb8, 0x33, 0xe3, 0xa4, 0xb9, 0x55, + 0x70, 0xe3, 0xc4, 0x7f, 0x80, 0xb8, 0x20, 0x8e, 0x39, 0xf0, 0x07, 0x70, 0x2c, 0xb7, 0x8a, 0x13, + 0xa7, 0x15, 0x4a, 0x0e, 0x39, 0x70, 0xc2, 0x7f, 0x01, 0x9a, 0x1f, 0xbb, 0xf6, 0xae, 0x2d, 0x6c, + 0x1f, 0xaa, 0x5e, 0x5a, 0xef, 0xbc, 0xef, 0x7b, 0xfb, 0xbe, 0x6f, 0xde, 0xbc, 0xd9, 0x80, 0x7b, + 0x84, 0x45, 0x84, 0x85, 0xcc, 0xe3, 0xa4, 0x8d, 0xf0, 0x11, 0x6c, 0x72, 0x42, 0xcf, 0xbc, 0x93, + 0x72, 0x03, 0x71, 0x58, 0xf6, 0xf8, 0x0b, 0xb7, 0x43, 0x09, 0x27, 0xe6, 0x96, 0x86, 0xb9, 0x83, + 0x30, 0x57, 0xc3, 0xac, 0x55, 0x18, 0x85, 0x98, 0x78, 0xf2, 0x5f, 0x45, 0xb0, 0x8a, 0x4d, 0xc9, + 0xf0, 0x1a, 0x10, 0xb7, 0xd3, 0x74, 0xe2, 0x61, 0x28, 0xce, 0x50, 0x1a, 0x6f, 0x92, 0x10, 0xeb, + 0xf8, 0x86, 0x8e, 0x47, 0x2c, 0xf0, 0x4e, 0xca, 0xe2, 0x3f, 0x1d, 0xd8, 0x54, 0x81, 0xba, 0x7c, + 0xf2, 0xd4, 0x83, 0x0e, 0xad, 0x07, 0x24, 0x20, 0x6a, 0x5d, 0xfc, 0xd2, 0xab, 0xef, 0x8f, 0x54, + 0xd8, 0x81, 0x14, 0x46, 0x9a, 0xe8, 0xfc, 0x64, 0x80, 0x77, 0x6a, 0x2c, 0x78, 0x4c, 0x11, 0xe4, + 0xe8, 0x4b, 0x84, 0x49, 0x64, 0x3e, 0x00, 0xb3, 0x0c, 0xe1, 0x16, 0xa2, 0x05, 0xe3, 0xae, 0x71, + 0x7f, 0xbe, 0xba, 0xda, 0x8b, 0xed, 0xa5, 0x33, 0x18, 0x7d, 0x5b, 0x71, 0xd4, 0xba, 0xe3, 0x6b, + 0x80, 0xe9, 0x81, 0x39, 0xd6, 0x6d, 0xb4, 0x04, 0xad, 0x70, 0x4d, 0x82, 0xd7, 0x7a, 0xb1, 0xbd, + 0xac, 0xc1, 0x3a, 0xe2, 0xf8, 0x29, 0xa8, 0x52, 0xfe, 0xee, 0xea, 0x7c, 0x5b, 0xb3, 0x7f, 0xb8, + 0x3a, 0xdf, 0x1e, 0x5d, 0x61, 0x53, 0x56, 0x53, 0x52, 0xec, 0x67, 0xe0, 0x76, 0xb6, 0x40, 0x1f, + 0xb1, 0x0e, 0xc1, 0x0c, 0x99, 0x55, 0xb0, 0x8c, 0xd1, 0x69, 0x5d, 0x52, 0xeb, 0xaa, 0x08, 0x55, + 0xb1, 0xd5, 0x8b, 0xed, 0xdb, 0xaa, 0x88, 0x1c, 0xc0, 0xf1, 0x97, 0x30, 0x3a, 0x3d, 0x14, 0x0b, + 0x32, 0x97, 0xf3, 0x8f, 0x01, 0x6e, 0xd5, 0x58, 0x50, 0x0b, 0x31, 0x9f, 0x46, 0xf8, 0x13, 0x30, + 0x0b, 0x23, 0xd2, 0xc5, 0x5c, 0xca, 0x5e, 0xd8, 0xd9, 0x74, 0xf5, 0x76, 0x88, 0x4d, 0x4d, 0x9a, + 0xc3, 0x7d, 0x4c, 0x42, 0x5c, 0x7d, 0xf7, 0x55, 0x6c, 0xcf, 0xf4, 0x33, 0x29, 0x9a, 0xe3, 0x6b, + 0xbe, 0xf9, 0x05, 0x58, 0x8a, 0x42, 0xcc, 0x0f, 0xc9, 0xa3, 0x56, 0x8b, 0x22, 0xc6, 0x0a, 0xd7, + 0xf3, 0x12, 0x44, 0xb8, 0xce, 0x49, 0x1d, 0x2a, 0x80, 0xe3, 0x67, 0x09, 0x95, 0x07, 0x39, 0x4f, + 0x37, 0x47, 0x7a, 0x2a, 0x38, 0xce, 0x2a, 0x58, 0xd6, 0x62, 0x13, 0x13, 0x9d, 0x7f, 0x95, 0x01, + 0xd5, 0x2e, 0xc5, 0x6f, 0xc7, 0x80, 0x7d, 0xb0, 0xdc, 0xe8, 0x52, 0xbc, 0x4f, 0x49, 0x94, 0xb5, + 0x60, 0xab, 0x17, 0xdb, 0x05, 0xc5, 0x11, 0x80, 0xfa, 0x11, 0x25, 0x51, 0xdf, 0x84, 0x3c, 0x69, + 0x42, 0x1b, 0x04, 0x4b, 0xdb, 0x20, 0x24, 0xa7, 0x36, 0xfc, 0xa1, 0xcf, 0xc1, 0x31, 0xc4, 0x01, + 0x7a, 0xd4, 0x8a, 0xc2, 0xa9, 0xdc, 0xf8, 0x10, 0xdc, 0x1c, 0x3c, 0x04, 0x2b, 0xbd, 0xd8, 0x5e, + 0x54, 0x48, 0xdd, 0x75, 0x2a, 0x6c, 0x96, 0xc1, 0xbc, 0x68, 0x48, 0x28, 0xf2, 0x6b, 0x95, 0xeb, + 0xbd, 0xd8, 0x5e, 0xe9, 0xf7, 0xaa, 0x0c, 0x39, 0xfe, 0x1c, 0x46, 0xa7, 0xb2, 0x8a, 0x49, 0x4f, + 0x8c, 0xac, 0xbb, 0xa4, 0xd8, 0x05, 0x75, 0x62, 0xfa, 0x52, 0x52, 0x95, 0x17, 0x06, 0x58, 0xaf, + 0xb1, 0xe0, 0x00, 0xf1, 0x2a, 0x3a, 0x22, 0x14, 0x1d, 0x20, 0xdc, 0x7a, 0x42, 0x48, 0xfb, 0x4d, + 0x68, 0xfd, 0x0c, 0x2c, 0x35, 0x09, 0xe6, 0x14, 0x36, 0xb9, 0xdc, 0x35, 0xad, 0xb7, 0xd0, 0x8b, + 0xed, 0x75, 0x85, 0xcf, 0x84, 0x1d, 0x7f, 0x31, 0x79, 0x16, 0x3b, 0x5a, 0xf9, 0x24, 0xa7, 0xfb, + 0xfe, 0x48, 0xdd, 0x0c, 0xf1, 0x52, 0x43, 0x4a, 0x11, 0xc8, 0xd2, 0x31, 0x21, 0x6d, 0xa7, 0x08, + 0xb6, 0x46, 0x69, 0x4c, 0x4d, 0xf8, 0xd9, 0x00, 0x6b, 0x0a, 0x20, 0x47, 0x40, 0x0d, 0x71, 0xd8, + 0x82, 0x1c, 0x4e, 0xe3, 0x81, 0x0f, 0xe6, 0x22, 0x4d, 0xd3, 0xfd, 0x7f, 0xa7, 0xdf, 0xff, 0xb8, + 0x9d, 0xf6, 0x7f, 0x92, 0xbb, 0xba, 0xa1, 0xcf, 0x80, 0x1e, 0x8d, 0x09, 0xd9, 0xf1, 0xd3, 0x3c, + 0x95, 0x85, 0x01, 0xc1, 0xce, 0x1d, 0xf0, 0xde, 0x88, 0x12, 0x53, 0x09, 0xf1, 0x35, 0xb0, 0x52, + 0x63, 0xc1, 0x3e, 0xa1, 0x4d, 0x74, 0x48, 0x21, 0x66, 0x47, 0x88, 0xbe, 0x9d, 0xd3, 0xeb, 0x83, + 0x35, 0xae, 0x0b, 0x18, 0x3e, 0xc1, 0x77, 0x7b, 0xb1, 0xbd, 0xa5, 0x78, 0x09, 0x28, 0x77, 0x8a, + 0x47, 0x91, 0xcd, 0xaf, 0xc0, 0x6a, 0xb2, 0xdc, 0x1f, 0x8b, 0x37, 0x64, 0xc6, 0x62, 0x2f, 0xb6, + 0xad, 0x5c, 0xc6, 0xc1, 0xd1, 0x38, 0x4c, 0xac, 0x3c, 0xcc, 0x35, 0xd2, 0x07, 0x23, 0x1b, 0xe9, + 0x48, 0x58, 0x59, 0x4a, 0xd8, 0x8e, 0x05, 0x0a, 0x79, 0x7f, 0x53, 0xf3, 0x7f, 0x37, 0xe4, 0xf8, + 0xf8, 0xba, 0xd3, 0x82, 0x1c, 0x3d, 0x95, 0x97, 0xa9, 0xb9, 0x07, 0xe6, 0x61, 0x97, 0x1f, 0x13, + 0x1a, 0xf2, 0x33, 0x6d, 0x7f, 0xe1, 0xcf, 0xdf, 0x4a, 0xeb, 0xda, 0x56, 0x5d, 0xcb, 0x01, 0xa7, + 0x21, 0x0e, 0xfc, 0x3e, 0xd4, 0xfc, 0x1c, 0xcc, 0xaa, 0xeb, 0x58, 0x6f, 0xc4, 0x96, 0x3b, 0xf2, + 0x6b, 0x43, 0xbd, 0xa5, 0x3a, 0x2f, 0xf6, 0xe2, 0xd7, 0xab, 0xf3, 0x6d, 0xc3, 0xd7, 0xb4, 0xca, + 0xae, 0x50, 0xd7, 0x4f, 0x28, 0x27, 0x44, 0x88, 0x39, 0xa2, 0xcd, 0x63, 0x18, 0xe2, 0xe7, 0x5d, + 0x44, 0x43, 0xc4, 0xbc, 0x5c, 0xb9, 0xce, 0x26, 0xd8, 0xc8, 0x2d, 0x25, 0xea, 0x76, 0x7e, 0xb9, + 0x05, 0xae, 0xd7, 0x58, 0x60, 0x3e, 0x07, 0x0b, 0x83, 0x1f, 0x05, 0x1f, 0xb9, 0xff, 0xf7, 0x19, + 0xe4, 0x66, 0x6f, 0x68, 0x6b, 0x77, 0x1a, 0x74, 0x7a, 0x9f, 0x3f, 0x03, 0x37, 0xe4, 0x3d, 0x7c, + 0x6f, 0x2c, 0x5b, 0xc0, 0xac, 0xd2, 0x44, 0xb0, 0xc1, 0xec, 0xf2, 0x92, 0x1b, 0x9f, 0x5d, 0xc0, + 0x26, 0xc8, 0x3e, 0x78, 0x7f, 0x48, 0xbb, 0x06, 0xee, 0x8e, 0x09, 0xec, 0xea, 0xa3, 0x27, 0xb1, + 0x6b, 0x78, 0x98, 0x9b, 0x2f, 0x0d, 0xb0, 0x32, 0x34, 0xc4, 0xca, 0x63, 0x53, 0xe5, 0x29, 0xd6, + 0xa7, 0x53, 0x53, 0xd2, 0x12, 0xbe, 0x37, 0xc0, 0xea, 0xf0, 0x65, 0xb2, 0x33, 0x49, 0xc2, 0x2c, + 0xc7, 0xaa, 0x4c, 0xcf, 0x49, 0xab, 0x38, 0x05, 0x4b, 0xd9, 0x49, 0xe8, 0x8e, 0x4d, 0x96, 0xc1, + 0x5b, 0x7b, 0xd3, 0xe1, 0xd3, 0x17, 0x73, 0xb0, 0x98, 0x99, 0x02, 0xe3, 0x7b, 0x66, 0x10, 0x6e, + 0x7d, 0x3c, 0x15, 0x3c, 0x79, 0xab, 0x75, 0xf3, 0xa5, 0x98, 0x00, 0xd5, 0xa7, 0xaf, 0x2e, 0x8a, + 0xc6, 0xeb, 0x8b, 0xa2, 0xf1, 0xf7, 0x45, 0xd1, 0xf8, 0xf1, 0xb2, 0x38, 0xf3, 0xfa, 0xb2, 0x38, + 0xf3, 0xd7, 0x65, 0x71, 0xe6, 0x9b, 0xbd, 0x20, 0xe4, 0xc7, 0xdd, 0x86, 0xdb, 0x24, 0x91, 0x87, + 0x51, 0x97, 0x53, 0x82, 0x4b, 0x84, 0x06, 0xc9, 0x6f, 0xef, 0x64, 0xd7, 0x7b, 0x91, 0x9d, 0x7e, + 0xfc, 0xac, 0x83, 0x58, 0x63, 0x56, 0xfe, 0x49, 0xf0, 0xf0, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xab, 0x2e, 0xa9, 0x6f, 0x19, 0x0d, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/tokenfactory/types/v1beta1/params.pb.go b/x/tokenfactory/types/v1beta1/params.pb.go new file mode 100644 index 000000000..2cf60f11d --- /dev/null +++ b/x/tokenfactory/types/v1beta1/params.pb.go @@ -0,0 +1,442 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: osmosis/tokenfactory/v1beta1/params.proto + +package v1beta1 + +import ( + fmt "fmt" + io "io" + math "math" + math_bits "math/bits" + + _ "github.com/cosmos/cosmos-proto" + github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" + types "github.com/cosmos/cosmos-sdk/types" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" +) + +// 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 + +// Params defines the parameters for the tokenfactory module. +type Params struct { + // DenomCreationFee defines the fee to be charged on the creation of a new + // denom. The fee is drawn from the MsgCreateDenom's sender account, and + // transferred to the community pool. + DenomCreationFee github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,1,rep,name=denom_creation_fee,json=denomCreationFee,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"denom_creation_fee" yaml:"denom_creation_fee"` + // DenomCreationGasConsume defines the gas cost for creating a new denom. + // This is intended as a spam deterrence mechanism. + // + // See: https://github.com/CosmWasm/token-factory/issues/11 + DenomCreationGasConsume uint64 `protobuf:"varint,2,opt,name=denom_creation_gas_consume,json=denomCreationGasConsume,proto3" json:"denom_creation_gas_consume,omitempty" yaml:"denom_creation_gas_consume"` + // FeeCollectorAddress is the address where fees collected from denom creation + // are sent to + FeeCollectorAddress string `protobuf:"bytes,3,opt,name=fee_collector_address,json=feeCollectorAddress,proto3" json:"fee_collector_address,omitempty"` +} + +func (m *Params) Reset() { *m = Params{} } +func (m *Params) String() string { return proto.CompactTextString(m) } +func (*Params) ProtoMessage() {} +func (*Params) Descriptor() ([]byte, []int) { + return fileDescriptor_cc8299d306f3ff47, []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 + +func (m *Params) GetDenomCreationFee() github_com_cosmos_cosmos_sdk_types.Coins { + if m != nil { + return m.DenomCreationFee + } + return nil +} + +func (m *Params) GetDenomCreationGasConsume() uint64 { + if m != nil { + return m.DenomCreationGasConsume + } + return 0 +} + +func (m *Params) GetFeeCollectorAddress() string { + if m != nil { + return m.FeeCollectorAddress + } + return "" +} + +func init() { + proto.RegisterType((*Params)(nil), "osmosis.tokenfactory.v1beta1.Params") +} + +func init() { + proto.RegisterFile("osmosis/tokenfactory/v1beta1/params.proto", fileDescriptor_cc8299d306f3ff47) +} + +var fileDescriptor_cc8299d306f3ff47 = []byte{ + // 376 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x52, 0xbd, 0x6e, 0xe2, 0x40, + 0x10, 0xf6, 0xc2, 0x09, 0xe9, 0x7c, 0xcd, 0xc9, 0x77, 0xa7, 0x03, 0x74, 0xb2, 0x39, 0x57, 0xa6, + 0xc0, 0x2b, 0x48, 0xaa, 0x14, 0x91, 0x82, 0xa5, 0xa4, 0x8a, 0x14, 0x51, 0x45, 0x69, 0xac, 0xb5, + 0x3d, 0x76, 0x2c, 0xf0, 0x0e, 0xf2, 0x2e, 0x28, 0xbc, 0x45, 0xaa, 0x3c, 0x44, 0xde, 0x21, 0x3d, + 0x25, 0x65, 0x2a, 0x27, 0x82, 0x37, 0xe0, 0x09, 0x22, 0xfc, 0x13, 0x41, 0x92, 0xca, 0x33, 0xf3, + 0x7d, 0xf3, 0xcd, 0xe7, 0x99, 0x55, 0xbb, 0x28, 0x12, 0x14, 0xb1, 0xa0, 0x12, 0xc7, 0xc0, 0x43, + 0xe6, 0x4b, 0x4c, 0x17, 0x74, 0xde, 0xf7, 0x40, 0xb2, 0x3e, 0x9d, 0xb2, 0x94, 0x25, 0xc2, 0x9e, + 0xa6, 0x28, 0x51, 0xfb, 0x57, 0x52, 0xed, 0x7d, 0xaa, 0x5d, 0x52, 0xdb, 0xba, 0x9f, 0xc3, 0xd4, + 0x63, 0x02, 0xde, 0xfb, 0x7d, 0x8c, 0x79, 0xd1, 0xdd, 0x6e, 0x15, 0xb8, 0x9b, 0x67, 0xb4, 0x48, + 0x4a, 0xe8, 0x77, 0x84, 0x11, 0x16, 0xf5, 0x5d, 0x54, 0x54, 0xcd, 0xa7, 0x9a, 0xda, 0xb8, 0xca, + 0xe7, 0x6b, 0x0f, 0x44, 0xd5, 0x02, 0xe0, 0x98, 0xb8, 0x7e, 0x0a, 0x4c, 0xc6, 0xc8, 0xdd, 0x10, + 0xa0, 0x49, 0x3a, 0x75, 0xeb, 0xc7, 0xa0, 0x65, 0x97, 0x62, 0xbb, 0xc9, 0x95, 0x1d, 0xdb, 0xc1, + 0x98, 0x0f, 0x2f, 0x97, 0x99, 0xa1, 0x6c, 0x33, 0xa3, 0xb5, 0x60, 0xc9, 0xe4, 0xc4, 0xfc, 0x2c, + 0x61, 0x3e, 0xbe, 0x18, 0x56, 0x14, 0xcb, 0xdb, 0x99, 0x67, 0xfb, 0x98, 0x94, 0xb6, 0xca, 0x4f, + 0x4f, 0x04, 0x63, 0x2a, 0x17, 0x53, 0x10, 0xb9, 0x9a, 0x18, 0xfd, 0xcc, 0x05, 0x9c, 0xb2, 0xff, + 0x1c, 0x40, 0x0b, 0xd5, 0xf6, 0x07, 0xd1, 0x88, 0x09, 0xd7, 0x47, 0x2e, 0x66, 0x09, 0x34, 0x6b, + 0x1d, 0x62, 0x7d, 0x1b, 0x76, 0x97, 0x99, 0x41, 0xb6, 0x99, 0xf1, 0xff, 0x4b, 0x13, 0x7b, 0x7c, + 0x73, 0xf4, 0xf7, 0x60, 0xc0, 0x05, 0x13, 0x4e, 0x81, 0x68, 0x03, 0xf5, 0x4f, 0x08, 0xe0, 0xfa, + 0x38, 0x99, 0xc0, 0x6e, 0xed, 0x2e, 0x0b, 0x82, 0x14, 0x84, 0x68, 0xd6, 0x3b, 0xc4, 0xfa, 0x3e, + 0xfa, 0x15, 0x02, 0x38, 0x15, 0x76, 0x56, 0x40, 0xc3, 0xeb, 0xe5, 0x5a, 0x27, 0xab, 0xb5, 0x4e, + 0x5e, 0xd7, 0x3a, 0xb9, 0xdf, 0xe8, 0xca, 0x6a, 0xa3, 0x2b, 0xcf, 0x1b, 0x5d, 0xb9, 0x39, 0xdd, + 0xfb, 0x63, 0x0e, 0x33, 0x99, 0x22, 0xef, 0x61, 0x1a, 0x55, 0x31, 0x9d, 0x1f, 0xd3, 0xbb, 0xc3, + 0xf7, 0x90, 0x6f, 0xa1, 0xba, 0xaa, 0xd7, 0xc8, 0x0f, 0x74, 0xf4, 0x16, 0x00, 0x00, 0xff, 0xff, + 0xc4, 0x5e, 0x24, 0x25, 0x3c, 0x02, 0x00, 0x00, +} + +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 + if len(m.FeeCollectorAddress) > 0 { + i -= len(m.FeeCollectorAddress) + copy(dAtA[i:], m.FeeCollectorAddress) + i = encodeVarintParams(dAtA, i, uint64(len(m.FeeCollectorAddress))) + i-- + dAtA[i] = 0x1a + } + if m.DenomCreationGasConsume != 0 { + i = encodeVarintParams(dAtA, i, uint64(m.DenomCreationGasConsume)) + i-- + dAtA[i] = 0x10 + } + if len(m.DenomCreationFee) > 0 { + for iNdEx := len(m.DenomCreationFee) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.DenomCreationFee[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintParams(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func encodeVarintParams(dAtA []byte, offset int, v uint64) int { + offset -= sovParams(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 len(m.DenomCreationFee) > 0 { + for _, e := range m.DenomCreationFee { + l = e.Size() + n += 1 + l + sovParams(uint64(l)) + } + } + if m.DenomCreationGasConsume != 0 { + n += 1 + sovParams(uint64(m.DenomCreationGasConsume)) + } + l = len(m.FeeCollectorAddress) + if l > 0 { + n += 1 + l + sovParams(uint64(l)) + } + return n +} + +func sovParams(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozParams(x uint64) (n int) { + return sovParams(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 ErrIntOverflowParams + } + 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 != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DenomCreationFee", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowParams + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthParams + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthParams + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DenomCreationFee = append(m.DenomCreationFee, types.Coin{}) + if err := m.DenomCreationFee[len(m.DenomCreationFee)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DenomCreationGasConsume", wireType) + } + m.DenomCreationGasConsume = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowParams + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.DenomCreationGasConsume |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FeeCollectorAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowParams + } + 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 ErrInvalidLengthParams + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthParams + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.FeeCollectorAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipParams(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthParams + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipParams(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, ErrIntOverflowParams + } + 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, ErrIntOverflowParams + } + 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, ErrIntOverflowParams + } + 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, ErrInvalidLengthParams + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupParams + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthParams + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthParams = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowParams = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupParams = fmt.Errorf("proto: unexpected end of group") +) From 2251fdd8915e07a9aa1ab71befe07bf716ffb0f3 Mon Sep 17 00:00:00 2001 From: Julian Compagni Portis Date: Tue, 18 Jun 2024 23:59:49 -0400 Subject: [PATCH 42/87] Fix tests --- x/tokenfactory/keeper/before_send_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/tokenfactory/keeper/before_send_test.go b/x/tokenfactory/keeper/before_send_test.go index 0378ab92f..965c7308d 100644 --- a/x/tokenfactory/keeper/before_send_test.go +++ b/x/tokenfactory/keeper/before_send_test.go @@ -73,7 +73,7 @@ func (suite *KeeperTestSuite) TestTrackBeforeSendWasm() { // Whitelist the hook params := types.DefaultParams() - params.WhitelistedHooks = []*types.HookWhitelist{{DenomCreator: senderAddress.String(), CodeID: codeID}} + params.WhitelistedHooks = []*types.HookWhitelist{{DenomCreator: suite.TestAccs[0].String(), CodeID: codeID}} err = suite.GetNeutronZoneApp(suite.ChainA).TokenFactoryKeeper.SetParams(suite.ChainA.GetContext(), params) suite.Require().NoError(err) From c07f8238f530e90b7377d01e5d6c350a28004714 Mon Sep 17 00:00:00 2001 From: Julian Compagni Portis Date: Tue, 18 Jun 2024 23:59:58 -0400 Subject: [PATCH 43/87] Add note on weird TF code --- x/tokenfactory/types/tx.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/x/tokenfactory/types/tx.go b/x/tokenfactory/types/tx.go index 3925b0b5a..8b908d852 100644 --- a/x/tokenfactory/types/tx.go +++ b/x/tokenfactory/types/tx.go @@ -32,5 +32,11 @@ func (msg *MsgUpdateParams) Validate() error { return errorsmod.Wrap(err, "authority is invalid") } + // TODO: This is inconsistent. Per Params.Validate() an empty creator address is valid as long as + // DenomCreationFee is nil. But This check fails if FeeCollectorAddress is unset. + if _, err := sdk.AccAddressFromBech32(msg.Params.FeeCollectorAddress); err != nil { + return errorsmod.Wrap(err, "fee_collector_address is invalid") + } + return msg.Params.Validate() } From 209c6b3c57d9a4dbcf7f60fcda7a002dc76fb35c Mon Sep 17 00:00:00 2001 From: Julian Compagni Portis Date: Wed, 19 Jun 2024 00:47:46 -0400 Subject: [PATCH 44/87] Block adding non-whitelisted hooks --- x/tokenfactory/keeper/before_send.go | 4 ++-- x/tokenfactory/keeper/msg_server.go | 9 +++++++++ x/tokenfactory/keeper/params.go | 10 +++++----- x/tokenfactory/types/errors.go | 23 ++++++++++++----------- 4 files changed, 28 insertions(+), 18 deletions(-) diff --git a/x/tokenfactory/keeper/before_send.go b/x/tokenfactory/keeper/before_send.go index 81e25796e..014140d0d 100644 --- a/x/tokenfactory/keeper/before_send.go +++ b/x/tokenfactory/keeper/before_send.go @@ -99,8 +99,8 @@ func (k Keeper) callBeforeSendListener(ctx context.Context, from, to sdk.AccAddr return err } - // Do not invoke hook if denom is not whitelisted and `from` is a module - if !k.isHookWhitelisted(c, coin.Denom, cwAddr) { + // Do not invoke hook if denom is not whitelisted + if err := k.AssertIsHookWhitelisted(c, coin.Denom, cwAddr); err != nil { return nil } diff --git a/x/tokenfactory/keeper/msg_server.go b/x/tokenfactory/keeper/msg_server.go index 39006c3ad..d708a8488 100644 --- a/x/tokenfactory/keeper/msg_server.go +++ b/x/tokenfactory/keeper/msg_server.go @@ -246,6 +246,15 @@ func (server msgServer) SetBeforeSendHook(goCtx context.Context, msg *types.MsgS return nil, types.ErrUnauthorized } + // If we are not removing a hook make sure it has been already whitelisted + if msg.ContractAddr != "" { + // msg.ContractAddr has already been validated + cwAddr := sdk.MustAccAddressFromBech32(msg.ContractAddr) + if err := server.Keeper.AssertIsHookWhitelisted(ctx, msg.Denom, cwAddr); err != nil { + return nil, err + } + } + err = server.Keeper.setBeforeSendHook(ctx, msg.Denom, msg.ContractAddr) if err != nil { return nil, err diff --git a/x/tokenfactory/keeper/params.go b/x/tokenfactory/keeper/params.go index e9e124f7b..4c97b9018 100644 --- a/x/tokenfactory/keeper/params.go +++ b/x/tokenfactory/keeper/params.go @@ -30,23 +30,23 @@ func (k Keeper) SetParams(ctx sdk.Context, params types.Params) error { return nil } -func (k Keeper) isHookWhitelisted(ctx sdk.Context, denom string, contractAddress sdk.AccAddress) bool { +func (k Keeper) AssertIsHookWhitelisted(ctx sdk.Context, denom string, contractAddress sdk.AccAddress) error { contractInfo := k.contractKeeper.GetContractInfo(ctx, contractAddress) if contractInfo == nil { - return false + return types.ErrBeforeSendHookNotWhitelisted.Wrapf("contract with address (%s) does not exist", contractAddress.String()) } codeID := contractInfo.CodeID whitelistedHooks := k.GetParams(ctx).WhitelistedHooks denomCreator, _, err := types.DeconstructDenom(denom) if err != nil { - return false + return types.ErrBeforeSendHookNotWhitelisted.Wrapf("invalid denom: %s", denom) } for _, hook := range whitelistedHooks { if hook.CodeID == codeID && hook.DenomCreator == denomCreator { - return true + return nil } } - return false + return types.ErrBeforeSendHookNotWhitelisted.Wrapf("no whitelist for contract with codeID (%d) and denomCreator (%s) ", codeID, denomCreator) } diff --git a/x/tokenfactory/types/errors.go b/x/tokenfactory/types/errors.go index c20e41980..91c2c2f13 100644 --- a/x/tokenfactory/types/errors.go +++ b/x/tokenfactory/types/errors.go @@ -8,15 +8,16 @@ import ( // x/tokenfactory module sentinel errors var ( - ErrDenomExists = errorsmod.Register(ModuleName, 2, "attempting to create a denom that already exists (has bank metadata)") - ErrUnauthorized = errorsmod.Register(ModuleName, 3, "unauthorized account") - ErrInvalidDenom = errorsmod.Register(ModuleName, 4, "invalid denom") - ErrInvalidCreator = errorsmod.Register(ModuleName, 5, "invalid creator") - ErrInvalidAuthorityMetadata = errorsmod.Register(ModuleName, 6, "invalid authority metadata") - ErrInvalidGenesis = errorsmod.Register(ModuleName, 7, "invalid genesis") - ErrSubdenomTooLong = errorsmod.Register(ModuleName, 8, fmt.Sprintf("subdenom too long, max length is %d bytes", MaxSubdenomLength)) - ErrCreatorTooLong = errorsmod.Register(ModuleName, 9, fmt.Sprintf("creator too long, max length is %d bytes", MaxCreatorLength)) - ErrDenomDoesNotExist = errorsmod.Register(ModuleName, 10, "denom does not exist") - ErrBurnFromModuleAccount = errorsmod.Register(ModuleName, 11, "burning from Module Account is not allowed") - ErrTrackBeforeSendOutOfGas = errorsmod.Register(ModuleName, 12, "gas meter hit maximum limit") + ErrDenomExists = errorsmod.Register(ModuleName, 2, "attempting to create a denom that already exists (has bank metadata)") + ErrUnauthorized = errorsmod.Register(ModuleName, 3, "unauthorized account") + ErrInvalidDenom = errorsmod.Register(ModuleName, 4, "invalid denom") + ErrInvalidCreator = errorsmod.Register(ModuleName, 5, "invalid creator") + ErrInvalidAuthorityMetadata = errorsmod.Register(ModuleName, 6, "invalid authority metadata") + ErrInvalidGenesis = errorsmod.Register(ModuleName, 7, "invalid genesis") + ErrSubdenomTooLong = errorsmod.Register(ModuleName, 8, fmt.Sprintf("subdenom too long, max length is %d bytes", MaxSubdenomLength)) + ErrCreatorTooLong = errorsmod.Register(ModuleName, 9, fmt.Sprintf("creator too long, max length is %d bytes", MaxCreatorLength)) + ErrDenomDoesNotExist = errorsmod.Register(ModuleName, 10, "denom does not exist") + ErrBurnFromModuleAccount = errorsmod.Register(ModuleName, 11, "burning from Module Account is not allowed") + ErrTrackBeforeSendOutOfGas = errorsmod.Register(ModuleName, 12, "gas meter hit maximum limit") + ErrBeforeSendHookNotWhitelisted = errorsmod.Register(ModuleName, 13, "beforeSendHook is not whitelisted") ) From 1b2cdecc81f7f79a92f5d6a01440f55e1780a9bd Mon Sep 17 00:00:00 2001 From: Julian Compagni Portis Date: Wed, 19 Jun 2024 01:04:48 -0400 Subject: [PATCH 45/87] Refactor + add more tests --- x/tokenfactory/keeper/before_send_test.go | 176 ++++++++++++---------- 1 file changed, 100 insertions(+), 76 deletions(-) diff --git a/x/tokenfactory/keeper/before_send_test.go b/x/tokenfactory/keeper/before_send_test.go index 965c7308d..e5e92ef83 100644 --- a/x/tokenfactory/keeper/before_send_test.go +++ b/x/tokenfactory/keeper/before_send_test.go @@ -2,7 +2,6 @@ package keeper_test import ( "encoding/json" - "fmt" "os" "cosmossdk.io/math" @@ -12,80 +11,105 @@ import ( "github.com/neutron-org/neutron/v4/x/tokenfactory/types" ) -func (suite *KeeperTestSuite) TestTrackBeforeSendWasm() { - for _, tc := range []struct { - name string - wasmFile string - }{ - { - name: "Test bank hook tracking contract ", - // https://github.com/neutron-org/neutron-dev-contracts/tree/feat/balance-tracker-contract/contracts/balance-tracker - wasmFile: "./testdata/balance_tracker.wasm", +func (suite *KeeperTestSuite) initBalanceTrackContract(denom string) (sdk.AccAddress, uint64, string) { + senderAddress := suite.ChainA.SenderAccounts[0].SenderAccount.GetAddress() + suite.TopUpWallet(suite.ChainA.GetContext(), senderAddress, suite.TestAccs[0]) + + // https://github.com/neutron-org/neutron-dev-contracts/tree/feat/balance-tracker-contract/contracts/balance-tracker + wasmFile := "./testdata/balance_tracker.wasm" + + // load wasm file + wasmCode, err := os.ReadFile(wasmFile) + suite.Require().NoError(err) + + // create new denom + res, err := suite.msgServer.CreateDenom(suite.ChainA.GetContext(), types.NewMsgCreateDenom(suite.TestAccs[0].String(), denom)) + suite.Require().NoError(err) + factoryDenom := res.GetNewTokenDenom() + + // instantiate wasm code + tokenFactoryModuleAddr := suite.GetNeutronZoneApp(suite.ChainA).AccountKeeper.GetModuleAddress("tokenfactory") + contractKeeper := wasmkeeper.NewDefaultPermissionKeeper(suite.GetNeutronZoneApp(suite.ChainA).WasmKeeper) + codeID, _, err := contractKeeper.Create(suite.ChainA.GetContext(), suite.TestAccs[0], wasmCode, nil) + suite.Require().NoError(err) + initMsg, _ := json.Marshal( + map[string]interface{}{ + "tracked_denom": factoryDenom, + "tokenfactory_module_address": tokenFactoryModuleAddr, }, - } { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - // setup test - suite.Setup() - - senderAddress := suite.ChainA.SenderAccounts[0].SenderAccount.GetAddress() - suite.TopUpWallet(suite.ChainA.GetContext(), senderAddress, suite.TestAccs[0]) - - // load wasm file - wasmCode, err := os.ReadFile(tc.wasmFile) - suite.Require().NoError(err) - - // create new denom - res, err := suite.msgServer.CreateDenom(suite.ChainA.GetContext(), types.NewMsgCreateDenom(suite.TestAccs[0].String(), "testdenom")) - suite.Require().NoError(err, "test: %v", tc.name) - factoryDenom := res.GetNewTokenDenom() - - // instantiate wasm code - tokenFactoryModuleAddr := suite.GetNeutronZoneApp(suite.ChainA).AccountKeeper.GetModuleAddress("tokenfactory") - contractKeeper := wasmkeeper.NewDefaultPermissionKeeper(suite.GetNeutronZoneApp(suite.ChainA).WasmKeeper) - codeID, _, err := contractKeeper.Create(suite.ChainA.GetContext(), suite.TestAccs[0], wasmCode, nil) - suite.Require().NoError(err, "test: %v", tc.name) - initMsg, _ := json.Marshal( - map[string]interface{}{ - "tracked_denom": factoryDenom, - "tokenfactory_module_address": tokenFactoryModuleAddr, - }, - ) - cosmwasmAddress, _, err := contractKeeper.Instantiate( - suite.ChainA.GetContext(), codeID, suite.TestAccs[0], suite.TestAccs[0], initMsg, "", sdk.NewCoins(), - ) - suite.Require().NoError(err, "test: %v", tc.name) - - // set beforesend hook to the new denom - _, err = suite.msgServer.SetBeforeSendHook(suite.ChainA.GetContext(), types.NewMsgSetBeforeSendHook(suite.TestAccs[0].String(), factoryDenom, cosmwasmAddress.String())) - suite.Require().NoError(err, "test: %v", tc.name) - - tokenToSend := sdk.NewCoin(factoryDenom, math.NewInt(100)) - - // mint tokens - _, err = suite.msgServer.Mint(suite.ChainA.GetContext(), types.NewMsgMint(suite.TestAccs[0].String(), tokenToSend)) - suite.Require().NoError(err) - - queryResp, err := suite.GetNeutronZoneApp(suite.ChainA).WasmKeeper.QuerySmart(suite.ChainA.GetContext(), cosmwasmAddress, []byte(`{"total_supply_at":{}}`)) - suite.Require().NoError(err) - - // Contract has not been called because it is not whitelisted - suite.Require().Equal("\"0\"", string(queryResp)) - - // Whitelist the hook - params := types.DefaultParams() - params.WhitelistedHooks = []*types.HookWhitelist{{DenomCreator: suite.TestAccs[0].String(), CodeID: codeID}} - err = suite.GetNeutronZoneApp(suite.ChainA).TokenFactoryKeeper.SetParams(suite.ChainA.GetContext(), params) - suite.Require().NoError(err) - - // mint tokens again - _, err = suite.msgServer.Mint(suite.ChainA.GetContext(), types.NewMsgMint(suite.TestAccs[0].String(), tokenToSend)) - suite.Require().NoError(err) - - queryResp, err = suite.GetNeutronZoneApp(suite.ChainA).WasmKeeper.QuerySmart(suite.ChainA.GetContext(), cosmwasmAddress, []byte(`{"total_supply_at":{}}`)) - suite.Require().NoError(err) - - // Whitelisted contract has now been called - suite.Require().Equal("\"100\"", string(queryResp)) - }) - } + ) + cosmwasmAddress, _, err := contractKeeper.Instantiate( + suite.ChainA.GetContext(), codeID, suite.TestAccs[0], suite.TestAccs[0], initMsg, "", sdk.NewCoins(), + ) + suite.Require().NoError(err) + + return cosmwasmAddress, codeID, factoryDenom +} + +func (suite *KeeperTestSuite) TestTrackBeforeSendWasm() { + suite.Setup() + + cosmwasmAddress, codeID, factoryDenom := suite.initBalanceTrackContract("testdenom") + + // Whitelist the hook + params := types.DefaultParams() + params.WhitelistedHooks = []*types.HookWhitelist{{DenomCreator: suite.TestAccs[0].String(), CodeID: codeID}} + err := suite.GetNeutronZoneApp(suite.ChainA).TokenFactoryKeeper.SetParams(suite.ChainA.GetContext(), params) + suite.Require().NoError(err) + + // set beforeSendHook for the new denom + _, err = suite.msgServer.SetBeforeSendHook(suite.ChainA.GetContext(), types.NewMsgSetBeforeSendHook(suite.TestAccs[0].String(), factoryDenom, cosmwasmAddress.String())) + suite.Require().NoError(err) + + tokenToSend := sdk.NewCoin(factoryDenom, math.NewInt(100)) + + // mint tokens + _, err = suite.msgServer.Mint(suite.ChainA.GetContext(), types.NewMsgMint(suite.TestAccs[0].String(), tokenToSend)) + suite.Require().NoError(err) + + queryResp, err := suite.GetNeutronZoneApp(suite.ChainA).WasmKeeper.QuerySmart(suite.ChainA.GetContext(), cosmwasmAddress, []byte(`{"total_supply_at":{}}`)) + // Whitelisted contract is called correctly + suite.Require().Equal("\"100\"", string(queryResp)) +} + +func (suite *KeeperTestSuite) TestAddNonWhitelistedHooksFails() { + suite.Setup() + + cosmwasmAddress, _, factoryDenom := suite.initBalanceTrackContract("testdenom") + + // WHEN to set beforeSendHook + _, err := suite.msgServer.SetBeforeSendHook(suite.ChainA.GetContext(), types.NewMsgSetBeforeSendHook(suite.TestAccs[0].String(), factoryDenom, cosmwasmAddress.String())) + // THEN fails with BeforeSendHookNotWhitelisted + suite.Require().ErrorIs(err, types.ErrBeforeSendHookNotWhitelisted) +} + +func (suite *KeeperTestSuite) TestNonWhitelistedHooksNotCalled() { + suite.Setup() + + cosmwasmAddress, codeID, factoryDenom := suite.initBalanceTrackContract("testdenom") + + // Whitelist the hook first so it can be added + params := types.DefaultParams() + params.WhitelistedHooks = []*types.HookWhitelist{{DenomCreator: suite.TestAccs[0].String(), CodeID: codeID}} + err := suite.GetNeutronZoneApp(suite.ChainA).TokenFactoryKeeper.SetParams(suite.ChainA.GetContext(), params) + suite.Require().NoError(err) + + // set beforeSendHook for the new denom + _, err = suite.msgServer.SetBeforeSendHook(suite.ChainA.GetContext(), types.NewMsgSetBeforeSendHook(suite.TestAccs[0].String(), factoryDenom, cosmwasmAddress.String())) + suite.Require().NoError(err) + + // Remove whitelist for the hook + params = types.DefaultParams() + err = suite.GetNeutronZoneApp(suite.ChainA).TokenFactoryKeeper.SetParams(suite.ChainA.GetContext(), params) + suite.Require().NoError(err) + + tokenToSend := sdk.NewCoin(factoryDenom, math.NewInt(100)) + + // mint tokens + _, err = suite.msgServer.Mint(suite.ChainA.GetContext(), types.NewMsgMint(suite.TestAccs[0].String(), tokenToSend)) + suite.Require().NoError(err) + + queryResp, err := suite.GetNeutronZoneApp(suite.ChainA).WasmKeeper.QuerySmart(suite.ChainA.GetContext(), cosmwasmAddress, []byte(`{"total_supply_at":{}}`)) + // Whitelisted contract is not called + suite.Require().Equal("\"0\"", string(queryResp)) } From 5469b7918f54139f6bd0bc91c679c618d5a4763a Mon Sep 17 00:00:00 2001 From: Julian Compagni Portis Date: Wed, 19 Jun 2024 01:39:34 -0400 Subject: [PATCH 46/87] add migration --- x/tokenfactory/keeper/migrations.go | 22 ++++++++ x/tokenfactory/migrations/v2/store.go | 62 ++++++++++++++++++++++ x/tokenfactory/migrations/v2/store_test.go | 52 ++++++++++++++++++ x/tokenfactory/module.go | 4 ++ x/tokenfactory/types/constants.go | 2 +- 5 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 x/tokenfactory/keeper/migrations.go create mode 100644 x/tokenfactory/migrations/v2/store.go create mode 100644 x/tokenfactory/migrations/v2/store_test.go diff --git a/x/tokenfactory/keeper/migrations.go b/x/tokenfactory/keeper/migrations.go new file mode 100644 index 000000000..12f76d00d --- /dev/null +++ b/x/tokenfactory/keeper/migrations.go @@ -0,0 +1,22 @@ +package keeper + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + + v2 "github.com/neutron-org/neutron/v4/x/tokenfactory/migrations/v2" +) + +// Migrator is a struct for handling in-place store migrations. +type Migrator struct { + keeper Keeper +} + +// NewMigrator returns a new Migrator. +func NewMigrator(keeper Keeper) Migrator { + return Migrator{keeper: keeper} +} + +// Migrate1to2 migrates from version 1 to 2. +func (m Migrator) Migrate1to2(ctx sdk.Context) error { + return v2.MigrateStore(ctx, m.keeper.cdc, m.keeper.storeKey) +} diff --git a/x/tokenfactory/migrations/v2/store.go b/x/tokenfactory/migrations/v2/store.go new file mode 100644 index 000000000..72e69bb65 --- /dev/null +++ b/x/tokenfactory/migrations/v2/store.go @@ -0,0 +1,62 @@ +package v2 + +import ( + "errors" + + storetypes "cosmossdk.io/store/types" + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/neutron-org/neutron/v4/x/tokenfactory/types" + v1beta1types "github.com/neutron-org/neutron/v4/x/tokenfactory/types/v1beta1" +) + +// MigrateStore performs in-place store migrations. +// The migration adds the new tokenfactory params WhitelistedHooks +func MigrateStore(ctx sdk.Context, cdc codec.BinaryCodec, storeKey storetypes.StoreKey) error { + return migrateParams(ctx, cdc, storeKey) + +} + +var WhitelistedHooks = []*types.HookWhitelist{ + + { // xASTRO balances tracker + CodeID: 944, + DenomCreator: "neutron1zlf3hutsa4qnmue53lz2tfxrutp8y2e3rj4nkghg3rupgl4mqy8s5jgxsn", + }, + { // NFA.zoneV1 + CodeID: 1265, + DenomCreator: "neutron1pwjn3tsumm3j7v7clzqhjsaukv4tdjlclhdytawhet68fwlz84fqcrdyf5", + }, +} + +func migrateParams(ctx sdk.Context, cdc codec.BinaryCodec, storeKey storetypes.StoreKey) error { + ctx.Logger().Info("Migrating tokenfactory params...") + + // fetch old params + store := ctx.KVStore(storeKey) + bz := store.Get(types.ParamsKey) + if bz == nil { + return errors.New("cannot fetch tokenfactory params from KV store") + } + var oldParams v1beta1types.Params + cdc.MustUnmarshal(bz, &oldParams) + + // add new param values + newParams := types.Params{ + DenomCreationFee: oldParams.DenomCreationFee, + DenomCreationGasConsume: oldParams.DenomCreationGasConsume, + FeeCollectorAddress: oldParams.FeeCollectorAddress, + WhitelistedHooks: WhitelistedHooks, + } + + // set params + bz, err := cdc.Marshal(&newParams) + if err != nil { + return err + } + store.Set(types.ParamsKey, bz) + + ctx.Logger().Info("Finished migrating tokenfactory params") + + return nil +} diff --git a/x/tokenfactory/migrations/v2/store_test.go b/x/tokenfactory/migrations/v2/store_test.go new file mode 100644 index 000000000..91c52ade1 --- /dev/null +++ b/x/tokenfactory/migrations/v2/store_test.go @@ -0,0 +1,52 @@ +package v2_test + +import ( + "testing" + + "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/neutron-org/neutron/v4/testutil" + v2 "github.com/neutron-org/neutron/v4/x/tokenfactory/migrations/v2" + "github.com/neutron-org/neutron/v4/x/tokenfactory/types" + "github.com/neutron-org/neutron/v4/x/tokenfactory/types/v1beta1" + "github.com/stretchr/testify/suite" +) + +type V3DexMigrationTestSuite struct { + testutil.IBCConnectionTestSuite +} + +func TestKeeperTestSuite(t *testing.T) { + suite.Run(t, new(V3DexMigrationTestSuite)) +} + +func (suite *V3DexMigrationTestSuite) TestParamsUpgrade() { + var ( + app = suite.GetNeutronZoneApp(suite.ChainA) + storeKey = app.GetKey(types.StoreKey) + ctx = suite.ChainA.GetContext() + cdc = app.AppCodec() + ) + + // Write old state + oldParams := v1beta1.Params{ + DenomCreationFee: sdk.NewCoins(sdk.NewCoin("untrn", math.OneInt())), + DenomCreationGasConsume: types.DefaultDenomCreationGasConsume, + FeeCollectorAddress: "test_addr", + } + store := ctx.KVStore(storeKey) + bz, err := cdc.Marshal(&oldParams) + suite.Require().NoError(err) + + store.Set(types.ParamsKey, bz) + + // Run migration + suite.NoError(v2.MigrateStore(ctx, cdc, storeKey)) + + // Check params are correct + newParams := app.TokenFactoryKeeper.GetParams(ctx) + suite.Require().EqualValues(oldParams.DenomCreationFee, newParams.DenomCreationFee) + suite.Require().EqualValues(newParams.DenomCreationGasConsume, newParams.DenomCreationGasConsume) + suite.Require().EqualValues(newParams.FeeCollectorAddress, newParams.FeeCollectorAddress) + suite.Require().EqualValues(newParams.WhitelistedHooks, v2.WhitelistedHooks) +} diff --git a/x/tokenfactory/module.go b/x/tokenfactory/module.go index 559495ff2..0f09e8260 100644 --- a/x/tokenfactory/module.go +++ b/x/tokenfactory/module.go @@ -135,6 +135,10 @@ func (AppModule) QuerierRoute() string { return types.QuerierRoute } func (am AppModule) RegisterServices(cfg module.Configurator) { types.RegisterQueryServer(cfg.QueryServer(), am.keeper) types.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(am.keeper)) + m := keeper.NewMigrator(am.keeper) + if err := cfg.RegisterMigration(types.ModuleName, 1, m.Migrate1to2); err != nil { + panic(fmt.Sprintf("failed to migrate x/tokenfactory from version 1 to 1: %v", err)) + } } // RegisterInvariants registers the tokenfactory module's invariants. diff --git a/x/tokenfactory/types/constants.go b/x/tokenfactory/types/constants.go index b68bbb99a..066fcad70 100644 --- a/x/tokenfactory/types/constants.go +++ b/x/tokenfactory/types/constants.go @@ -1,5 +1,5 @@ package types -const ConsensusVersion = 1 +const ConsensusVersion = 2 var TrackBeforeSendGasLimit = uint64(100_000) From 448149e2bbeae08ce3ecabc3f56895c7529f71b9 Mon Sep 17 00:00:00 2001 From: Julian Compagni Portis Date: Wed, 19 Jun 2024 01:42:55 -0400 Subject: [PATCH 47/87] lint --- x/tokenfactory/keeper/before_send_test.go | 2 ++ x/tokenfactory/migrations/v2/store.go | 3 +-- x/tokenfactory/migrations/v2/store_test.go | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/x/tokenfactory/keeper/before_send_test.go b/x/tokenfactory/keeper/before_send_test.go index e5e92ef83..bf3c7150a 100644 --- a/x/tokenfactory/keeper/before_send_test.go +++ b/x/tokenfactory/keeper/before_send_test.go @@ -68,6 +68,7 @@ func (suite *KeeperTestSuite) TestTrackBeforeSendWasm() { suite.Require().NoError(err) queryResp, err := suite.GetNeutronZoneApp(suite.ChainA).WasmKeeper.QuerySmart(suite.ChainA.GetContext(), cosmwasmAddress, []byte(`{"total_supply_at":{}}`)) + suite.Require().NoError(err) // Whitelisted contract is called correctly suite.Require().Equal("\"100\"", string(queryResp)) } @@ -110,6 +111,7 @@ func (suite *KeeperTestSuite) TestNonWhitelistedHooksNotCalled() { suite.Require().NoError(err) queryResp, err := suite.GetNeutronZoneApp(suite.ChainA).WasmKeeper.QuerySmart(suite.ChainA.GetContext(), cosmwasmAddress, []byte(`{"total_supply_at":{}}`)) + suite.Require().NoError(err) // Whitelisted contract is not called suite.Require().Equal("\"0\"", string(queryResp)) } diff --git a/x/tokenfactory/migrations/v2/store.go b/x/tokenfactory/migrations/v2/store.go index 72e69bb65..ac9ae1a29 100644 --- a/x/tokenfactory/migrations/v2/store.go +++ b/x/tokenfactory/migrations/v2/store.go @@ -6,6 +6,7 @@ import ( storetypes "cosmossdk.io/store/types" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/neutron-org/neutron/v4/x/tokenfactory/types" v1beta1types "github.com/neutron-org/neutron/v4/x/tokenfactory/types/v1beta1" ) @@ -14,11 +15,9 @@ import ( // The migration adds the new tokenfactory params WhitelistedHooks func MigrateStore(ctx sdk.Context, cdc codec.BinaryCodec, storeKey storetypes.StoreKey) error { return migrateParams(ctx, cdc, storeKey) - } var WhitelistedHooks = []*types.HookWhitelist{ - { // xASTRO balances tracker CodeID: 944, DenomCreator: "neutron1zlf3hutsa4qnmue53lz2tfxrutp8y2e3rj4nkghg3rupgl4mqy8s5jgxsn", diff --git a/x/tokenfactory/migrations/v2/store_test.go b/x/tokenfactory/migrations/v2/store_test.go index 91c52ade1..1985ff107 100644 --- a/x/tokenfactory/migrations/v2/store_test.go +++ b/x/tokenfactory/migrations/v2/store_test.go @@ -5,11 +5,12 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/suite" + "github.com/neutron-org/neutron/v4/testutil" v2 "github.com/neutron-org/neutron/v4/x/tokenfactory/migrations/v2" "github.com/neutron-org/neutron/v4/x/tokenfactory/types" "github.com/neutron-org/neutron/v4/x/tokenfactory/types/v1beta1" - "github.com/stretchr/testify/suite" ) type V3DexMigrationTestSuite struct { From 5b971b1a83ce1712880f57eb353be62108846fe1 Mon Sep 17 00:00:00 2001 From: Julian Compagni Portis Date: Wed, 19 Jun 2024 15:21:50 -0400 Subject: [PATCH 48/87] add migration to remove non-whitelisted tf hooks --- x/tokenfactory/keeper/migrations.go | 2 +- x/tokenfactory/migrations/v2/store.go | 55 ++++++++++++++++- x/tokenfactory/migrations/v2/store_test.go | 72 +++++++++++++++++++++- 3 files changed, 125 insertions(+), 4 deletions(-) diff --git a/x/tokenfactory/keeper/migrations.go b/x/tokenfactory/keeper/migrations.go index 12f76d00d..fa10d45ae 100644 --- a/x/tokenfactory/keeper/migrations.go +++ b/x/tokenfactory/keeper/migrations.go @@ -18,5 +18,5 @@ func NewMigrator(keeper Keeper) Migrator { // Migrate1to2 migrates from version 1 to 2. func (m Migrator) Migrate1to2(ctx sdk.Context) error { - return v2.MigrateStore(ctx, m.keeper.cdc, m.keeper.storeKey) + return v2.MigrateStore(ctx, m.keeper.cdc, m.keeper.storeKey, m.keeper) } diff --git a/x/tokenfactory/migrations/v2/store.go b/x/tokenfactory/migrations/v2/store.go index ac9ae1a29..e81e4d90a 100644 --- a/x/tokenfactory/migrations/v2/store.go +++ b/x/tokenfactory/migrations/v2/store.go @@ -2,6 +2,9 @@ package v2 import ( "errors" + "strings" + + "cosmossdk.io/store/prefix" storetypes "cosmossdk.io/store/types" "github.com/cosmos/cosmos-sdk/codec" @@ -11,10 +14,22 @@ import ( v1beta1types "github.com/neutron-org/neutron/v4/x/tokenfactory/types/v1beta1" ) +type TokenFactoryKeeper interface { + AssertIsHookWhitelisted(ctx sdk.Context, denom string, contractAddress sdk.AccAddress) error +} + // MigrateStore performs in-place store migrations. // The migration adds the new tokenfactory params WhitelistedHooks -func MigrateStore(ctx sdk.Context, cdc codec.BinaryCodec, storeKey storetypes.StoreKey) error { - return migrateParams(ctx, cdc, storeKey) +func MigrateStore(ctx sdk.Context, cdc codec.BinaryCodec, storeKey storetypes.StoreKey, keeper TokenFactoryKeeper) error { + // NOTE: this must happen first since the migrateHooks relies on the new params + if err := migrateParams(ctx, cdc, storeKey); err != nil { + return err + } + if err := migrateHooks(ctx, cdc, storeKey, keeper); err != nil { + return err + } + + return nil } var WhitelistedHooks = []*types.HookWhitelist{ @@ -59,3 +74,39 @@ func migrateParams(ctx sdk.Context, cdc codec.BinaryCodec, storeKey storetypes.S return nil } + +func migrateHooks(ctx sdk.Context, cdc codec.BinaryCodec, storeKey storetypes.StoreKey, keeper TokenFactoryKeeper) error { + ctx.Logger().Info("Migrating tokenfactory hooks...") + + // get hook store + store := prefix.NewStore(ctx.KVStore(storeKey), []byte(types.DenomsPrefixKey)) + iterator := storetypes.KVStorePrefixIterator(store, []byte{}) + + for ; iterator.Valid(); iterator.Next() { + keyParts := strings.Split(string(iterator.Key()), types.KeySeparator) + + // Hooks and authorityMetadata are in the same store we only care about the hooks + if keyParts[2] == types.BeforeSendHookAddressPrefixKey { + denom := keyParts[1] + contractAddr, err := sdk.AccAddressFromBech32(string(iterator.Value())) + if err != nil { + return errors.New("cannot parse hook contract address") + } + + err = keeper.AssertIsHookWhitelisted(ctx, denom, contractAddr) + if err != nil { + // If hook is not whitelisted delete it + store.Delete(iterator.Key()) + } + } + } + + err := iterator.Close() + if err != nil { + return err + } + + ctx.Logger().Info("Finished migrating tokenfactory hooks") + + return nil +} diff --git a/x/tokenfactory/migrations/v2/store_test.go b/x/tokenfactory/migrations/v2/store_test.go index 1985ff107..9f62318ab 100644 --- a/x/tokenfactory/migrations/v2/store_test.go +++ b/x/tokenfactory/migrations/v2/store_test.go @@ -1,9 +1,12 @@ package v2_test import ( + "encoding/json" + "os" "testing" "cosmossdk.io/math" + wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/suite" @@ -42,7 +45,7 @@ func (suite *V3DexMigrationTestSuite) TestParamsUpgrade() { store.Set(types.ParamsKey, bz) // Run migration - suite.NoError(v2.MigrateStore(ctx, cdc, storeKey)) + suite.NoError(v2.MigrateStore(ctx, cdc, storeKey, app.TokenFactoryKeeper)) // Check params are correct newParams := app.TokenFactoryKeeper.GetParams(ctx) @@ -51,3 +54,70 @@ func (suite *V3DexMigrationTestSuite) TestParamsUpgrade() { suite.Require().EqualValues(newParams.FeeCollectorAddress, newParams.FeeCollectorAddress) suite.Require().EqualValues(newParams.WhitelistedHooks, v2.WhitelistedHooks) } + +func (suite *V3DexMigrationTestSuite) TestHooksUpgrade() { + var ( + app = suite.GetNeutronZoneApp(suite.ChainA) + storeKey = app.GetKey(types.StoreKey) + ctx = suite.ChainA.GetContext() + cdc = app.AppCodec() + addr1 = suite.ChainA.SenderAccounts[0].SenderAccount.GetAddress() + addr2 = suite.ChainA.SenderAccounts[1].SenderAccount.GetAddress() + ) + + wasmFile := "../../keeper/testdata/balance_tracker.wasm" + wasmCode, err := os.ReadFile(wasmFile) + suite.Require().NoError(err) + + // Setup contract + contractKeeper := wasmkeeper.NewDefaultPermissionKeeper(suite.GetNeutronZoneApp(suite.ChainA).WasmKeeper) + codeID, _, err := contractKeeper.Create(ctx, addr1, wasmCode, nil) + tokenFactoryModuleAddr := app.AccountKeeper.GetModuleAddress(types.ModuleName) + initMsg, _ := json.Marshal( + map[string]interface{}{ + "tracked_denom": "test_denom", + "tokenfactory_module_address": tokenFactoryModuleAddr, + }, + ) + cwAddress, _, err := contractKeeper.Instantiate(ctx, codeID, addr1, addr1, initMsg, "", sdk.NewCoins()) + suite.Require().NoError(err) + cwAddressStr := cwAddress.String() + + // Add Denoms and hooks + factoryDenom1, err := app.TokenFactoryKeeper.CreateDenom(ctx, addr1.String(), "test1") + suite.Require().NoError(err) + store := app.TokenFactoryKeeper.GetDenomPrefixStore(ctx, factoryDenom1) + store.Set([]byte(types.BeforeSendHookAddressPrefixKey), []byte(cwAddressStr)) + + factoryDenom2, err := app.TokenFactoryKeeper.CreateDenom(ctx, addr2.String(), "test2") + suite.Require().NoError(err) + store = app.TokenFactoryKeeper.GetDenomPrefixStore(ctx, factoryDenom2) + store.Set([]byte(types.BeforeSendHookAddressPrefixKey), []byte(cwAddressStr)) + + factoryDenom3, err := app.TokenFactoryKeeper.CreateDenom(ctx, addr2.String(), "test3") + suite.Require().NoError(err) + store = app.TokenFactoryKeeper.GetDenomPrefixStore(ctx, factoryDenom2) + store.Set([]byte(types.BeforeSendHookAddressPrefixKey), []byte(cwAddressStr)) + + // Include the hook we want to whitelist in the params migration + v2.WhitelistedHooks = []*types.HookWhitelist{ + { + CodeID: codeID, + DenomCreator: addr1.String(), + }, + } + + // Run migration + suite.NoError(v2.MigrateStore(ctx, cdc, storeKey, app.TokenFactoryKeeper)) + + // The whitelisted hook is still there + hook1 := app.TokenFactoryKeeper.GetBeforeSendHook(ctx, factoryDenom1) + suite.Assert().Equal(cwAddressStr, hook1) + + //The non whitelisted hooks have been removed + hook2 := app.TokenFactoryKeeper.GetBeforeSendHook(ctx, factoryDenom2) + suite.Assert().Equal("", hook2) + hook3 := app.TokenFactoryKeeper.GetBeforeSendHook(ctx, factoryDenom3) + suite.Assert().Equal("", hook3) + +} From d4b551cb2cc77aab3508e2d8b5f5750608264e95 Mon Sep 17 00:00:00 2001 From: Julian Compagni Portis Date: Wed, 19 Jun 2024 15:26:21 -0400 Subject: [PATCH 49/87] lint --- x/tokenfactory/migrations/v2/store.go | 6 +++--- x/tokenfactory/migrations/v2/store_test.go | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/x/tokenfactory/migrations/v2/store.go b/x/tokenfactory/migrations/v2/store.go index e81e4d90a..2eb5f5f8d 100644 --- a/x/tokenfactory/migrations/v2/store.go +++ b/x/tokenfactory/migrations/v2/store.go @@ -25,7 +25,7 @@ func MigrateStore(ctx sdk.Context, cdc codec.BinaryCodec, storeKey storetypes.St if err := migrateParams(ctx, cdc, storeKey); err != nil { return err } - if err := migrateHooks(ctx, cdc, storeKey, keeper); err != nil { + if err := migrateHooks(ctx, storeKey, keeper); err != nil { return err } @@ -75,7 +75,7 @@ func migrateParams(ctx sdk.Context, cdc codec.BinaryCodec, storeKey storetypes.S return nil } -func migrateHooks(ctx sdk.Context, cdc codec.BinaryCodec, storeKey storetypes.StoreKey, keeper TokenFactoryKeeper) error { +func migrateHooks(ctx sdk.Context, storeKey storetypes.StoreKey, keeper TokenFactoryKeeper) error { ctx.Logger().Info("Migrating tokenfactory hooks...") // get hook store @@ -85,7 +85,7 @@ func migrateHooks(ctx sdk.Context, cdc codec.BinaryCodec, storeKey storetypes.St for ; iterator.Valid(); iterator.Next() { keyParts := strings.Split(string(iterator.Key()), types.KeySeparator) - // Hooks and authorityMetadata are in the same store we only care about the hooks + // Hooks and authorityMetadata are in the same store, we only care about the hooks if keyParts[2] == types.BeforeSendHookAddressPrefixKey { denom := keyParts[1] contractAddr, err := sdk.AccAddressFromBech32(string(iterator.Value())) diff --git a/x/tokenfactory/migrations/v2/store_test.go b/x/tokenfactory/migrations/v2/store_test.go index 9f62318ab..19c1f5072 100644 --- a/x/tokenfactory/migrations/v2/store_test.go +++ b/x/tokenfactory/migrations/v2/store_test.go @@ -72,6 +72,7 @@ func (suite *V3DexMigrationTestSuite) TestHooksUpgrade() { // Setup contract contractKeeper := wasmkeeper.NewDefaultPermissionKeeper(suite.GetNeutronZoneApp(suite.ChainA).WasmKeeper) codeID, _, err := contractKeeper.Create(ctx, addr1, wasmCode, nil) + suite.Require().NoError(err) tokenFactoryModuleAddr := app.AccountKeeper.GetModuleAddress(types.ModuleName) initMsg, _ := json.Marshal( map[string]interface{}{ @@ -114,10 +115,9 @@ func (suite *V3DexMigrationTestSuite) TestHooksUpgrade() { hook1 := app.TokenFactoryKeeper.GetBeforeSendHook(ctx, factoryDenom1) suite.Assert().Equal(cwAddressStr, hook1) - //The non whitelisted hooks have been removed + // The non whitelisted hooks have been removed hook2 := app.TokenFactoryKeeper.GetBeforeSendHook(ctx, factoryDenom2) suite.Assert().Equal("", hook2) hook3 := app.TokenFactoryKeeper.GetBeforeSendHook(ctx, factoryDenom3) suite.Assert().Equal("", hook3) - } From 71ee07e8ece2fd3824a54abba44011ab0c3964e9 Mon Sep 17 00:00:00 2001 From: Julian Compagni Portis Date: Wed, 19 Jun 2024 15:45:16 -0400 Subject: [PATCH 50/87] misc review fixes --- proto/osmosis/tokenfactory/params.proto | 5 +- x/tokenfactory/keeper/before_send_test.go | 4 +- x/tokenfactory/migrations/v2/store.go | 2 +- x/tokenfactory/migrations/v2/store_test.go | 2 +- x/tokenfactory/module.go | 2 +- x/tokenfactory/types/params.go | 8 +- x/tokenfactory/types/params.pb.go | 121 +++++++++++---------- 7 files changed, 73 insertions(+), 71 deletions(-) diff --git a/proto/osmosis/tokenfactory/params.proto b/proto/osmosis/tokenfactory/params.proto index 604da3956..ef7a36f6d 100644 --- a/proto/osmosis/tokenfactory/params.proto +++ b/proto/osmosis/tokenfactory/params.proto @@ -7,7 +7,7 @@ import "gogoproto/gogo.proto"; option go_package = "github.com/neutron-org/neutron/v4/x/tokenfactory/types"; -message HookWhitelist { +message WhitelistedHook { uint64 code_id = 1 [(gogoproto.customname) = "CodeID"]; string denom_creator = 2; } @@ -35,5 +35,6 @@ message Params { // FeeCollectorAddress is the address where fees collected from denom creation // are sent to string fee_collector_address = 3; - repeated HookWhitelist whitelisted_hooks = 4; + // HookWhitelist is the list of hooks which are allowed to be added and executed + repeated WhitelistedHook whitelisted_hooks = 4; } diff --git a/x/tokenfactory/keeper/before_send_test.go b/x/tokenfactory/keeper/before_send_test.go index bf3c7150a..cd1def71d 100644 --- a/x/tokenfactory/keeper/before_send_test.go +++ b/x/tokenfactory/keeper/before_send_test.go @@ -53,7 +53,7 @@ func (suite *KeeperTestSuite) TestTrackBeforeSendWasm() { // Whitelist the hook params := types.DefaultParams() - params.WhitelistedHooks = []*types.HookWhitelist{{DenomCreator: suite.TestAccs[0].String(), CodeID: codeID}} + params.WhitelistedHooks = []*types.WhitelistedHook{{DenomCreator: suite.TestAccs[0].String(), CodeID: codeID}} err := suite.GetNeutronZoneApp(suite.ChainA).TokenFactoryKeeper.SetParams(suite.ChainA.GetContext(), params) suite.Require().NoError(err) @@ -91,7 +91,7 @@ func (suite *KeeperTestSuite) TestNonWhitelistedHooksNotCalled() { // Whitelist the hook first so it can be added params := types.DefaultParams() - params.WhitelistedHooks = []*types.HookWhitelist{{DenomCreator: suite.TestAccs[0].String(), CodeID: codeID}} + params.WhitelistedHooks = []*types.WhitelistedHook{{DenomCreator: suite.TestAccs[0].String(), CodeID: codeID}} err := suite.GetNeutronZoneApp(suite.ChainA).TokenFactoryKeeper.SetParams(suite.ChainA.GetContext(), params) suite.Require().NoError(err) diff --git a/x/tokenfactory/migrations/v2/store.go b/x/tokenfactory/migrations/v2/store.go index 2eb5f5f8d..408317c17 100644 --- a/x/tokenfactory/migrations/v2/store.go +++ b/x/tokenfactory/migrations/v2/store.go @@ -32,7 +32,7 @@ func MigrateStore(ctx sdk.Context, cdc codec.BinaryCodec, storeKey storetypes.St return nil } -var WhitelistedHooks = []*types.HookWhitelist{ +var WhitelistedHooks = []*types.WhitelistedHook{ { // xASTRO balances tracker CodeID: 944, DenomCreator: "neutron1zlf3hutsa4qnmue53lz2tfxrutp8y2e3rj4nkghg3rupgl4mqy8s5jgxsn", diff --git a/x/tokenfactory/migrations/v2/store_test.go b/x/tokenfactory/migrations/v2/store_test.go index 19c1f5072..b65b99cba 100644 --- a/x/tokenfactory/migrations/v2/store_test.go +++ b/x/tokenfactory/migrations/v2/store_test.go @@ -101,7 +101,7 @@ func (suite *V3DexMigrationTestSuite) TestHooksUpgrade() { store.Set([]byte(types.BeforeSendHookAddressPrefixKey), []byte(cwAddressStr)) // Include the hook we want to whitelist in the params migration - v2.WhitelistedHooks = []*types.HookWhitelist{ + v2.WhitelistedHooks = []*types.WhitelistedHook{ { CodeID: codeID, DenomCreator: addr1.String(), diff --git a/x/tokenfactory/module.go b/x/tokenfactory/module.go index 0f09e8260..c0a2322a3 100644 --- a/x/tokenfactory/module.go +++ b/x/tokenfactory/module.go @@ -137,7 +137,7 @@ func (am AppModule) RegisterServices(cfg module.Configurator) { types.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(am.keeper)) m := keeper.NewMigrator(am.keeper) if err := cfg.RegisterMigration(types.ModuleName, 1, m.Migrate1to2); err != nil { - panic(fmt.Sprintf("failed to migrate x/tokenfactory from version 1 to 1: %v", err)) + panic(fmt.Sprintf("failed to migrate x/tokenfactory from version 1 to 2: %v", err)) } } diff --git a/x/tokenfactory/types/params.go b/x/tokenfactory/types/params.go index 06c1f76aa..8dcd4a029 100644 --- a/x/tokenfactory/types/params.go +++ b/x/tokenfactory/types/params.go @@ -17,7 +17,7 @@ var ( DefaultDenomCreationFee sdk.Coins DefaultDenomCreationGasConsume uint64 DefaultFeeCollectorAddress = "" - DefaultWhitelistedHooks = []*HookWhitelist{} + DefaultWhitelistedHooks = []*WhitelistedHook{} ) // ParamKeyTable the param key table for tokenfactory module. @@ -25,7 +25,7 @@ func ParamKeyTable() paramtypes.KeyTable { return paramtypes.NewKeyTable().RegisterParamSet(&Params{}) } -func NewParams(denomCreationFee sdk.Coins, denomCreationGasConsume uint64, feeCollectorAddress string, whitelistedHooks []*HookWhitelist) Params { +func NewParams(denomCreationFee sdk.Coins, denomCreationGasConsume uint64, feeCollectorAddress string, whitelistedHooks []*WhitelistedHook) Params { return Params{ DenomCreationFee: denomCreationFee, DenomCreationGasConsume: denomCreationGasConsume, @@ -115,7 +115,7 @@ func validateFeeCollectorAddress(i interface{}) error { } func validateWhitelistedHooks(i interface{}) error { - hooks, ok := i.([]*HookWhitelist) + hooks, ok := i.([]*WhitelistedHook) if !ok { return fmt.Errorf("invalid parameter type: %T", i) } @@ -124,7 +124,7 @@ func validateWhitelistedHooks(i interface{}) error { for _, hook := range hooks { hookStr := hook.String() if seenHooks[hookStr] { - return fmt.Errorf("duplicate whitelisted hook: %#v", hook) + return fmt.Errorf("duplicate whitelisted hook: %s", hookStr) } seenHooks[hookStr] = true _, err := sdk.AccAddressFromBech32(hook.DenomCreator) diff --git a/x/tokenfactory/types/params.pb.go b/x/tokenfactory/types/params.pb.go index d05e3c72d..6138df390 100644 --- a/x/tokenfactory/types/params.pb.go +++ b/x/tokenfactory/types/params.pb.go @@ -27,23 +27,23 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package -type HookWhitelist struct { +type WhitelistedHook struct { CodeID uint64 `protobuf:"varint,1,opt,name=code_id,json=codeId,proto3" json:"code_id,omitempty"` DenomCreator string `protobuf:"bytes,2,opt,name=denom_creator,json=denomCreator,proto3" json:"denom_creator,omitempty"` } -func (m *HookWhitelist) Reset() { *m = HookWhitelist{} } -func (m *HookWhitelist) String() string { return proto.CompactTextString(m) } -func (*HookWhitelist) ProtoMessage() {} -func (*HookWhitelist) Descriptor() ([]byte, []int) { +func (m *WhitelistedHook) Reset() { *m = WhitelistedHook{} } +func (m *WhitelistedHook) String() string { return proto.CompactTextString(m) } +func (*WhitelistedHook) ProtoMessage() {} +func (*WhitelistedHook) Descriptor() ([]byte, []int) { return fileDescriptor_09c297db7c49d1cf, []int{0} } -func (m *HookWhitelist) XXX_Unmarshal(b []byte) error { +func (m *WhitelistedHook) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *HookWhitelist) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *WhitelistedHook) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_HookWhitelist.Marshal(b, m, deterministic) + return xxx_messageInfo_WhitelistedHook.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -53,26 +53,26 @@ func (m *HookWhitelist) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return b[:n], nil } } -func (m *HookWhitelist) XXX_Merge(src proto.Message) { - xxx_messageInfo_HookWhitelist.Merge(m, src) +func (m *WhitelistedHook) XXX_Merge(src proto.Message) { + xxx_messageInfo_WhitelistedHook.Merge(m, src) } -func (m *HookWhitelist) XXX_Size() int { +func (m *WhitelistedHook) XXX_Size() int { return m.Size() } -func (m *HookWhitelist) XXX_DiscardUnknown() { - xxx_messageInfo_HookWhitelist.DiscardUnknown(m) +func (m *WhitelistedHook) XXX_DiscardUnknown() { + xxx_messageInfo_WhitelistedHook.DiscardUnknown(m) } -var xxx_messageInfo_HookWhitelist proto.InternalMessageInfo +var xxx_messageInfo_WhitelistedHook proto.InternalMessageInfo -func (m *HookWhitelist) GetCodeID() uint64 { +func (m *WhitelistedHook) GetCodeID() uint64 { if m != nil { return m.CodeID } return 0 } -func (m *HookWhitelist) GetDenomCreator() string { +func (m *WhitelistedHook) GetDenomCreator() string { if m != nil { return m.DenomCreator } @@ -92,8 +92,9 @@ type Params struct { DenomCreationGasConsume uint64 `protobuf:"varint,2,opt,name=denom_creation_gas_consume,json=denomCreationGasConsume,proto3" json:"denom_creation_gas_consume,omitempty" yaml:"denom_creation_gas_consume"` // FeeCollectorAddress is the address where fees collected from denom creation // are sent to - FeeCollectorAddress string `protobuf:"bytes,3,opt,name=fee_collector_address,json=feeCollectorAddress,proto3" json:"fee_collector_address,omitempty"` - WhitelistedHooks []*HookWhitelist `protobuf:"bytes,4,rep,name=whitelisted_hooks,json=whitelistedHooks,proto3" json:"whitelisted_hooks,omitempty"` + FeeCollectorAddress string `protobuf:"bytes,3,opt,name=fee_collector_address,json=feeCollectorAddress,proto3" json:"fee_collector_address,omitempty"` + // HookWhitelist is the list of hooks which are allowed to be added and executed + WhitelistedHooks []*WhitelistedHook `protobuf:"bytes,4,rep,name=whitelisted_hooks,json=whitelistedHooks,proto3" json:"whitelisted_hooks,omitempty"` } func (m *Params) Reset() { *m = Params{} } @@ -150,7 +151,7 @@ func (m *Params) GetFeeCollectorAddress() string { return "" } -func (m *Params) GetWhitelistedHooks() []*HookWhitelist { +func (m *Params) GetWhitelistedHooks() []*WhitelistedHook { if m != nil { return m.WhitelistedHooks } @@ -158,46 +159,46 @@ func (m *Params) GetWhitelistedHooks() []*HookWhitelist { } func init() { - proto.RegisterType((*HookWhitelist)(nil), "osmosis.tokenfactory.HookWhitelist") + proto.RegisterType((*WhitelistedHook)(nil), "osmosis.tokenfactory.WhitelistedHook") proto.RegisterType((*Params)(nil), "osmosis.tokenfactory.Params") } func init() { proto.RegisterFile("osmosis/tokenfactory/params.proto", fileDescriptor_09c297db7c49d1cf) } var fileDescriptor_09c297db7c49d1cf = []byte{ - // 456 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x52, 0xb1, 0x8e, 0xd3, 0x40, - 0x10, 0x8d, 0x49, 0x14, 0xc4, 0xc2, 0x49, 0x87, 0x39, 0x84, 0x93, 0xc2, 0xce, 0x39, 0x4d, 0x28, - 0xce, 0xd6, 0x1d, 0x88, 0x82, 0x8e, 0x18, 0x01, 0x57, 0x20, 0x45, 0x6e, 0x10, 0x34, 0xd6, 0xc6, - 0x3b, 0x76, 0x56, 0x89, 0x77, 0x22, 0xef, 0xe6, 0x20, 0x5f, 0x01, 0x15, 0x1f, 0xc1, 0x97, 0xa4, - 0xbc, 0x92, 0xca, 0xa0, 0xe4, 0x0f, 0xee, 0x0b, 0x90, 0xd7, 0x8e, 0x70, 0xe0, 0x2a, 0xef, 0xbc, - 0x37, 0x33, 0x9e, 0xf7, 0x66, 0xc8, 0x29, 0xca, 0x0c, 0x25, 0x97, 0xbe, 0xc2, 0x39, 0x88, 0x84, - 0xc6, 0x0a, 0xf3, 0xb5, 0xbf, 0xa4, 0x39, 0xcd, 0xa4, 0xb7, 0xcc, 0x51, 0xa1, 0x79, 0x52, 0xa7, - 0x78, 0xcd, 0x94, 0xbe, 0x1d, 0x6b, 0xd8, 0x9f, 0x52, 0x09, 0xfe, 0xd5, 0xf9, 0x14, 0x14, 0x3d, - 0xf7, 0x63, 0xe4, 0xa2, 0xaa, 0xea, 0xf7, 0x2a, 0x3e, 0xd2, 0x91, 0x5f, 0x05, 0x35, 0x75, 0x92, - 0x62, 0x8a, 0x15, 0x5e, 0xbe, 0x2a, 0xd4, 0xfd, 0x48, 0x8e, 0xde, 0x21, 0xce, 0x3f, 0xcc, 0xb8, - 0x82, 0x05, 0x97, 0xca, 0x1c, 0x92, 0xbb, 0x31, 0x32, 0x88, 0x38, 0xb3, 0x8c, 0x81, 0x31, 0xea, - 0x8c, 0xc9, 0xb6, 0x70, 0xba, 0x01, 0x32, 0xb8, 0x7c, 0x1d, 0x76, 0x4b, 0xea, 0x92, 0x99, 0x43, - 0x72, 0xc4, 0x40, 0x60, 0x16, 0xc5, 0x39, 0x50, 0x85, 0xb9, 0x75, 0x67, 0x60, 0x8c, 0xee, 0x85, - 0x0f, 0x34, 0x18, 0x54, 0x98, 0xfb, 0xb5, 0x4d, 0xba, 0x13, 0x2d, 0xc9, 0xfc, 0x6e, 0x10, 0xb3, - 0x51, 0xc0, 0x51, 0x44, 0x09, 0x80, 0x65, 0x0c, 0xda, 0xa3, 0xfb, 0x17, 0x3d, 0xaf, 0x9e, 0xb3, - 0x14, 0xe5, 0xd5, 0xa2, 0xbc, 0x00, 0xb9, 0x18, 0xbf, 0xdf, 0x14, 0x4e, 0xeb, 0xa6, 0x70, 0x7a, - 0x6b, 0x9a, 0x2d, 0x5e, 0xba, 0xff, 0xb7, 0x70, 0x7f, 0xfc, 0x72, 0x46, 0x29, 0x57, 0xb3, 0xd5, - 0xd4, 0x8b, 0x31, 0xab, 0x15, 0xd7, 0x9f, 0x33, 0xc9, 0xe6, 0xbe, 0x5a, 0x2f, 0x41, 0xea, 0x6e, - 0x32, 0x3c, 0xfe, 0x3b, 0x1f, 0x47, 0xf1, 0x06, 0xc0, 0x4c, 0x48, 0xff, 0x9f, 0xa6, 0x29, 0x95, - 0x51, 0x8c, 0x42, 0xae, 0x32, 0xd0, 0xaa, 0x3a, 0xe3, 0xa7, 0x9b, 0xc2, 0x31, 0x6e, 0x0a, 0xe7, - 0xf4, 0xd6, 0x21, 0x1a, 0xf9, 0x6e, 0xf8, 0xe4, 0xe0, 0x07, 0x6f, 0xa9, 0x0c, 0x2a, 0xc6, 0xbc, - 0x20, 0x8f, 0x13, 0x80, 0x28, 0xc6, 0xc5, 0x02, 0xca, 0x4d, 0x46, 0x94, 0xb1, 0x1c, 0xa4, 0xb4, - 0xda, 0xda, 0xb8, 0x47, 0x09, 0x40, 0xb0, 0xe7, 0x5e, 0x55, 0x94, 0x39, 0x21, 0x0f, 0x3f, 0xef, - 0xd7, 0x02, 0x2c, 0x9a, 0x21, 0xce, 0xa5, 0xd5, 0xd1, 0x96, 0x0d, 0xbd, 0xdb, 0xae, 0xc3, 0x3b, - 0xd8, 0x64, 0x78, 0xdc, 0xa8, 0x2e, 0x19, 0x39, 0x9e, 0x6c, 0xb6, 0xb6, 0x71, 0xbd, 0xb5, 0x8d, - 0xdf, 0x5b, 0xdb, 0xf8, 0xb6, 0xb3, 0x5b, 0xd7, 0x3b, 0xbb, 0xf5, 0x73, 0x67, 0xb7, 0x3e, 0xbd, - 0x68, 0x78, 0x28, 0x60, 0xa5, 0x72, 0x14, 0x67, 0x98, 0xa7, 0xfb, 0xb7, 0x7f, 0xf5, 0xdc, 0xff, - 0x72, 0x78, 0xac, 0xda, 0xd7, 0x69, 0x57, 0x5f, 0xd1, 0xb3, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, - 0x1d, 0x23, 0x36, 0x33, 0xd1, 0x02, 0x00, 0x00, -} - -func (m *HookWhitelist) Marshal() (dAtA []byte, err error) { + // 457 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x52, 0xc1, 0x6e, 0xd3, 0x40, + 0x10, 0x8d, 0x49, 0x14, 0xc4, 0x02, 0xa2, 0x98, 0x22, 0x9c, 0x1c, 0xec, 0xd4, 0x15, 0x52, 0x38, + 0xd4, 0xab, 0x16, 0xc4, 0x81, 0x1b, 0x31, 0x02, 0x7a, 0x40, 0xaa, 0x7c, 0x41, 0x82, 0x83, 0xb5, + 0xf1, 0x8e, 0x9d, 0x55, 0xe2, 0x9d, 0xc8, 0xbb, 0x69, 0xc9, 0x5f, 0xc0, 0x85, 0x8f, 0xe0, 0x4b, + 0x72, 0xec, 0x91, 0x93, 0x41, 0xc9, 0x1f, 0xf4, 0x0b, 0x50, 0xd6, 0xae, 0x9a, 0x94, 0x9c, 0xbc, + 0xf3, 0xde, 0xcc, 0x78, 0xde, 0x9b, 0x21, 0x07, 0xa8, 0x72, 0x54, 0x42, 0x51, 0x8d, 0x63, 0x90, + 0x29, 0x4b, 0x34, 0x16, 0x73, 0x3a, 0x65, 0x05, 0xcb, 0x55, 0x30, 0x2d, 0x50, 0xa3, 0xbd, 0x5f, + 0xa7, 0x04, 0x9b, 0x29, 0x5d, 0x37, 0x31, 0x30, 0x1d, 0x32, 0x05, 0xf4, 0xfc, 0x78, 0x08, 0x9a, + 0x1d, 0xd3, 0x04, 0x85, 0xac, 0xaa, 0xba, 0x9d, 0x8a, 0x8f, 0x4d, 0x44, 0xab, 0xa0, 0xa6, 0xf6, + 0x33, 0xcc, 0xb0, 0xc2, 0xd7, 0xaf, 0x0a, 0xf5, 0xbf, 0x92, 0x47, 0x9f, 0x47, 0x42, 0xc3, 0x44, + 0x28, 0x0d, 0xfc, 0x23, 0xe2, 0xd8, 0x3e, 0x24, 0x77, 0x13, 0xe4, 0x10, 0x0b, 0xee, 0x58, 0x3d, + 0xab, 0xdf, 0x1a, 0x90, 0x65, 0xe9, 0xb5, 0x43, 0xe4, 0x70, 0xfa, 0x2e, 0x6a, 0xaf, 0xa9, 0x53, + 0x6e, 0x1f, 0x92, 0x87, 0x1c, 0x24, 0xe6, 0x71, 0x52, 0x00, 0xd3, 0x58, 0x38, 0x77, 0x7a, 0x56, + 0xff, 0x5e, 0xf4, 0xc0, 0x80, 0x61, 0x85, 0xf9, 0x3f, 0x9a, 0xa4, 0x7d, 0x66, 0x44, 0xd9, 0x3f, + 0x2d, 0x62, 0x6f, 0x14, 0x08, 0x94, 0x71, 0x0a, 0xe0, 0x58, 0xbd, 0x66, 0xff, 0xfe, 0x49, 0x27, + 0xa8, 0x27, 0x5d, 0xcb, 0x0a, 0x6a, 0x59, 0x41, 0x88, 0x42, 0x0e, 0x3e, 0x2d, 0x4a, 0xaf, 0x71, + 0x55, 0x7a, 0x9d, 0x39, 0xcb, 0x27, 0x6f, 0xfc, 0xff, 0x5b, 0xf8, 0xbf, 0xfe, 0x78, 0xfd, 0x4c, + 0xe8, 0xd1, 0x6c, 0x18, 0x24, 0x98, 0xd7, 0x9a, 0xeb, 0xcf, 0x91, 0xe2, 0x63, 0xaa, 0xe7, 0x53, + 0x50, 0xa6, 0x9b, 0x8a, 0xf6, 0x6e, 0xe6, 0x13, 0x28, 0xdf, 0x03, 0xd8, 0x29, 0xe9, 0xde, 0x6a, + 0x9a, 0x31, 0x15, 0x27, 0x28, 0xd5, 0x2c, 0x07, 0xa3, 0xaa, 0x35, 0x78, 0xb1, 0x28, 0x3d, 0xeb, + 0xaa, 0xf4, 0x0e, 0x76, 0x0e, 0xb1, 0x91, 0xef, 0x47, 0xcf, 0xb6, 0x7e, 0xf0, 0x81, 0xa9, 0xb0, + 0x62, 0xec, 0x13, 0xf2, 0x34, 0x05, 0x88, 0x13, 0x9c, 0x4c, 0x60, 0xbd, 0xcb, 0x98, 0x71, 0x5e, + 0x80, 0x52, 0x4e, 0xd3, 0x18, 0xf7, 0x24, 0x05, 0x08, 0xaf, 0xb9, 0xb7, 0x15, 0x65, 0x47, 0xe4, + 0xf1, 0xc5, 0xcd, 0x72, 0xe2, 0x11, 0xe2, 0x58, 0x39, 0x2d, 0x63, 0xd9, 0xf3, 0x60, 0xd7, 0x7d, + 0x04, 0xb7, 0x76, 0x19, 0xed, 0x5d, 0x6c, 0x03, 0x6a, 0x70, 0xb6, 0x58, 0xba, 0xd6, 0xe5, 0xd2, + 0xb5, 0xfe, 0x2e, 0x5d, 0xeb, 0xfb, 0xca, 0x6d, 0x5c, 0xae, 0xdc, 0xc6, 0xef, 0x95, 0xdb, 0xf8, + 0xf2, 0x7a, 0xc3, 0x45, 0x09, 0x33, 0x5d, 0xa0, 0x3c, 0xc2, 0x22, 0xbb, 0x7e, 0xd3, 0xf3, 0x57, + 0xf4, 0xdb, 0xf6, 0xc1, 0x1a, 0x67, 0x87, 0x6d, 0x73, 0x49, 0x2f, 0xff, 0x05, 0x00, 0x00, 0xff, + 0xff, 0x0e, 0x4e, 0x8c, 0xba, 0xd5, 0x02, 0x00, 0x00, +} + +func (m *WhitelistedHook) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -207,12 +208,12 @@ func (m *HookWhitelist) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *HookWhitelist) MarshalTo(dAtA []byte) (int, error) { +func (m *WhitelistedHook) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *HookWhitelist) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *WhitelistedHook) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -306,7 +307,7 @@ func encodeVarintParams(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } -func (m *HookWhitelist) Size() (n int) { +func (m *WhitelistedHook) Size() (n int) { if m == nil { return 0 } @@ -356,7 +357,7 @@ func sovParams(x uint64) (n int) { func sozParams(x uint64) (n int) { return sovParams(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } -func (m *HookWhitelist) Unmarshal(dAtA []byte) error { +func (m *WhitelistedHook) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -379,10 +380,10 @@ func (m *HookWhitelist) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: HookWhitelist: wiretype end group for non-group") + return fmt.Errorf("proto: WhitelistedHook: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: HookWhitelist: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: WhitelistedHook: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -600,7 +601,7 @@ func (m *Params) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.WhitelistedHooks = append(m.WhitelistedHooks, &HookWhitelist{}) + m.WhitelistedHooks = append(m.WhitelistedHooks, &WhitelistedHook{}) if err := m.WhitelistedHooks[len(m.WhitelistedHooks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } From a6eae66545df6e128da2c7cac81ff4c1c02deb7b Mon Sep 17 00:00:00 2001 From: Julian Compagni Portis Date: Wed, 19 Jun 2024 15:47:19 -0400 Subject: [PATCH 51/87] regen swagger --- docs/static/swagger.yaml | 69 +++++++++++++++++++++++++++++++++------- 1 file changed, 58 insertions(+), 11 deletions(-) diff --git a/docs/static/swagger.yaml b/docs/static/swagger.yaml index 3a5fa1ee6..a10ae098e 100644 --- a/docs/static/swagger.yaml +++ b/docs/static/swagger.yaml @@ -18637,17 +18637,7 @@ definitions: type: array type: object type: object - osmosis.tokenfactory.v1beta1.DenomAuthorityMetadata: - description: |- - DenomAuthorityMetadata specifies metadata for addresses that have specific - capabilities over a token factory denom. Right now there is only one Admin - permission, but is planned to be extended to the future. - properties: - Admin: - title: Can be empty for no admin, or a valid osmosis address - type: string - type: object - osmosis.tokenfactory.v1beta1.Params: + osmosis.tokenfactory.Params: description: Params defines the parameters for the tokenfactory module. properties: denom_creation_fee: @@ -18686,6 +18676,37 @@ definitions: are sent to type: string + whitelisted_hooks: + items: + properties: + code_id: + format: uint64 + type: string + denom_creator: + type: string + type: object + title: >- + HookWhitelist is the list of hooks which are allowed to be added and + executed + type: array + type: object + osmosis.tokenfactory.WhitelistedHook: + properties: + code_id: + format: uint64 + type: string + denom_creator: + type: string + type: object + osmosis.tokenfactory.v1beta1.DenomAuthorityMetadata: + description: |- + DenomAuthorityMetadata specifies metadata for addresses that have specific + capabilities over a token factory denom. Right now there is only one Admin + permission, but is planned to be extended to the future. + properties: + Admin: + title: Can be empty for no admin, or a valid osmosis address + type: string type: object osmosis.tokenfactory.v1beta1.QueryBeforeSendHookAddressResponse: description: |- @@ -18774,6 +18795,19 @@ definitions: are sent to type: string + whitelisted_hooks: + items: + properties: + code_id: + format: uint64 + type: string + denom_creator: + type: string + type: object + title: >- + HookWhitelist is the list of hooks which are allowed to be added + and executed + type: array type: object type: object packetforward.v1.Params: @@ -43742,6 +43776,19 @@ paths: are sent to type: string + whitelisted_hooks: + items: + properties: + code_id: + format: uint64 + type: string + denom_creator: + type: string + type: object + title: >- + HookWhitelist is the list of hooks which are allowed to be + added and executed + type: array type: object type: object default: From 688e7f10e89eef262a5f85d37da0695a7bb1f6b4 Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Thu, 20 Jun 2024 09:14:21 +0300 Subject: [PATCH 52/87] fix import/export tokenfactory hooks --- .../tokenfactory/v1beta1/genesis.proto | 2 + x/tokenfactory/keeper/genesis.go | 17 ++- x/tokenfactory/keeper/genesis_test.go | 2 + x/tokenfactory/types/genesis.pb.go | 109 +++++++++++++----- 4 files changed, 102 insertions(+), 28 deletions(-) diff --git a/proto/osmosis/tokenfactory/v1beta1/genesis.proto b/proto/osmosis/tokenfactory/v1beta1/genesis.proto index a7d695544..5a1726129 100644 --- a/proto/osmosis/tokenfactory/v1beta1/genesis.proto +++ b/proto/osmosis/tokenfactory/v1beta1/genesis.proto @@ -29,4 +29,6 @@ message GenesisDenom { (gogoproto.moretags) = "yaml:\"authority_metadata\"", (gogoproto.nullable) = false ]; + + string hook_contract_address = 3 [(gogoproto.nullable) = true]; } diff --git a/x/tokenfactory/keeper/genesis.go b/x/tokenfactory/keeper/genesis.go index 5b58b09a8..7957edf90 100644 --- a/x/tokenfactory/keeper/genesis.go +++ b/x/tokenfactory/keeper/genesis.go @@ -24,14 +24,24 @@ func (k Keeper) InitGenesis(ctx sdk.Context, genState types.GenesisState) { if err != nil { panic(err) } + err = k.createDenomAfterValidation(ctx, creator, genDenom.GetDenom()) if err != nil { panic(err) } + err = k.setAuthorityMetadata(ctx, genDenom.GetDenom(), genDenom.GetAuthorityMetadata()) if err != nil { panic(err) } + + if _, err := sdk.AccAddressFromBech32(genDenom.HookContractAddress); genDenom.HookContractAddress != "" && err != nil { + panic(err) + } + + if err := k.setBeforeSendHook(ctx, genDenom.Denom, genDenom.HookContractAddress); err != nil { + panic(err) + } } } @@ -43,14 +53,17 @@ func (k Keeper) ExportGenesis(ctx sdk.Context) *types.GenesisState { for ; iterator.Valid(); iterator.Next() { denom := string(iterator.Value()) + contractHook := k.GetBeforeSendHook(ctx, denom) + authorityMetadata, err := k.GetAuthorityMetadata(ctx, denom) if err != nil { panic(err) } genDenoms = append(genDenoms, types.GenesisDenom{ - Denom: denom, - AuthorityMetadata: authorityMetadata, + Denom: denom, + AuthorityMetadata: authorityMetadata, + HookContractAddress: contractHook, }) } diff --git a/x/tokenfactory/keeper/genesis_test.go b/x/tokenfactory/keeper/genesis_test.go index 83ad23e4f..e059b848f 100644 --- a/x/tokenfactory/keeper/genesis_test.go +++ b/x/tokenfactory/keeper/genesis_test.go @@ -14,6 +14,7 @@ func (suite *KeeperTestSuite) TestGenesis() { AuthorityMetadata: types.DenomAuthorityMetadata{ Admin: "neutron1m9l358xunhhwds0568za49mzhvuxx9ux8xafx2", }, + HookContractAddress: "", }, { Denom: "factory/neutron1m9l358xunhhwds0568za49mzhvuxx9ux8xafx2/diff-admin", @@ -26,6 +27,7 @@ func (suite *KeeperTestSuite) TestGenesis() { AuthorityMetadata: types.DenomAuthorityMetadata{ Admin: "neutron1m9l358xunhhwds0568za49mzhvuxx9ux8xafx2", }, + HookContractAddress: "neutron1m9l358xunhhwds0568za49mzhvuxx9ux8xafx2", }, }, } diff --git a/x/tokenfactory/types/genesis.pb.go b/x/tokenfactory/types/genesis.pb.go index 29435e226..50dac9062 100644 --- a/x/tokenfactory/types/genesis.pb.go +++ b/x/tokenfactory/types/genesis.pb.go @@ -82,8 +82,9 @@ func (m *GenesisState) GetFactoryDenoms() []GenesisDenom { // state. The structure contains DenomAuthorityMetadata which defines the // denom's admin. type GenesisDenom struct { - Denom string `protobuf:"bytes,1,opt,name=denom,proto3" json:"denom,omitempty" yaml:"denom"` - AuthorityMetadata DenomAuthorityMetadata `protobuf:"bytes,2,opt,name=authority_metadata,json=authorityMetadata,proto3" json:"authority_metadata" yaml:"authority_metadata"` + Denom string `protobuf:"bytes,1,opt,name=denom,proto3" json:"denom,omitempty" yaml:"denom"` + AuthorityMetadata DenomAuthorityMetadata `protobuf:"bytes,2,opt,name=authority_metadata,json=authorityMetadata,proto3" json:"authority_metadata" yaml:"authority_metadata"` + HookContractAddress string `protobuf:"bytes,3,opt,name=hook_contract_address,json=hookContractAddress,proto3" json:"hook_contract_address,omitempty"` } func (m *GenesisDenom) Reset() { *m = GenesisDenom{} } @@ -133,6 +134,13 @@ func (m *GenesisDenom) GetAuthorityMetadata() DenomAuthorityMetadata { return DenomAuthorityMetadata{} } +func (m *GenesisDenom) GetHookContractAddress() string { + if m != nil { + return m.HookContractAddress + } + return "" +} + func init() { proto.RegisterType((*GenesisState)(nil), "osmosis.tokenfactory.v1beta1.GenesisState") proto.RegisterType((*GenesisDenom)(nil), "osmosis.tokenfactory.v1beta1.GenesisDenom") @@ -143,30 +151,33 @@ func init() { } var fileDescriptor_5749c3f71850298b = []byte{ - // 368 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0xca, 0x2f, 0xce, 0xcd, - 0x2f, 0xce, 0x2c, 0xd6, 0x2f, 0xc9, 0xcf, 0x4e, 0xcd, 0x4b, 0x4b, 0x4c, 0x2e, 0xc9, 0x2f, 0xaa, - 0xd4, 0x2f, 0x33, 0x4c, 0x4a, 0x2d, 0x49, 0x34, 0xd4, 0x4f, 0x4f, 0xcd, 0x4b, 0x2d, 0xce, 0x2c, - 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x81, 0xaa, 0xd5, 0x43, 0x56, 0xab, 0x07, 0x55, - 0x2b, 0x25, 0x92, 0x9e, 0x9f, 0x9e, 0x0f, 0x56, 0xa8, 0x0f, 0x62, 0x41, 0xf4, 0x48, 0x99, 0xe0, - 0x35, 0x3f, 0xb1, 0xb4, 0x24, 0x23, 0xbf, 0x28, 0xb3, 0xa4, 0xd2, 0x37, 0xb5, 0x24, 0x31, 0x25, - 0xb1, 0x24, 0x11, 0xaa, 0x4b, 0x13, 0xaf, 0xae, 0x82, 0xc4, 0xa2, 0xc4, 0x5c, 0xa8, 0xa3, 0x94, - 0x8e, 0x30, 0x72, 0xf1, 0xb8, 0x43, 0x9c, 0x19, 0x5c, 0x92, 0x58, 0x92, 0x2a, 0xe4, 0xc4, 0xc5, - 0x06, 0x51, 0x20, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x6d, 0xa4, 0xa2, 0x87, 0xcf, 0xd9, 0x7a, 0x01, - 0x60, 0xb5, 0x4e, 0x2c, 0x27, 0xee, 0xc9, 0x33, 0x04, 0x41, 0x75, 0x0a, 0x15, 0x70, 0xf1, 0x41, - 0xd5, 0xc5, 0xa7, 0xa4, 0xe6, 0xe5, 0xe7, 0x16, 0x4b, 0x30, 0x29, 0x30, 0x6b, 0x70, 0x1b, 0x69, - 0xe1, 0x37, 0x0b, 0xea, 0x0e, 0x17, 0x90, 0x16, 0x27, 0x59, 0x90, 0x89, 0x9f, 0xee, 0xc9, 0x8b, - 0x56, 0x26, 0xe6, 0xe6, 0x58, 0x29, 0xa1, 0x9a, 0xa7, 0x14, 0xc4, 0x0b, 0x15, 0x70, 0x81, 0xf0, - 0x8f, 0x22, 0xbc, 0x01, 0x16, 0x11, 0x52, 0xe3, 0x62, 0x05, 0x2b, 0x05, 0xfb, 0x82, 0xd3, 0x49, - 0xe0, 0xd3, 0x3d, 0x79, 0x1e, 0x88, 0x49, 0x60, 0x61, 0xa5, 0x20, 0x88, 0xb4, 0x50, 0x1b, 0x23, - 0x97, 0x10, 0x3c, 0x18, 0xe3, 0x73, 0xa1, 0xe1, 0x28, 0xc1, 0x04, 0xf6, 0xbb, 0x09, 0x7e, 0xf7, - 0x82, 0x6d, 0x72, 0x44, 0x8f, 0x03, 0x27, 0x45, 0xa8, 0xcb, 0x25, 0x21, 0xf6, 0x61, 0x9a, 0xae, - 0x14, 0x24, 0x88, 0x11, 0x73, 0x56, 0x2c, 0x2f, 0x16, 0xc8, 0x33, 0x3a, 0x05, 0x9c, 0x78, 0x24, - 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, 0xcb, 0x31, 0x5c, 0x78, - 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x94, 0x59, 0x7a, 0x66, 0x49, 0x46, 0x69, 0x92, 0x5e, - 0x72, 0x7e, 0xae, 0x7e, 0x5e, 0x6a, 0x69, 0x49, 0x51, 0x7e, 0x9e, 0x6e, 0x7e, 0x51, 0x3a, 0x8c, - 0xad, 0x5f, 0x66, 0xa2, 0x5f, 0x81, 0x1a, 0xdf, 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x49, 0x6c, 0xe0, - 0x78, 0x36, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xd1, 0xcf, 0x93, 0x08, 0xaa, 0x02, 0x00, 0x00, + // 407 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0xcf, 0xaa, 0xd3, 0x40, + 0x14, 0xc6, 0x33, 0xf7, 0x5e, 0x0b, 0xa6, 0x55, 0x34, 0x5a, 0x88, 0x45, 0x93, 0x1a, 0x44, 0x6a, + 0xc1, 0x84, 0xd6, 0x22, 0xd2, 0x5d, 0x63, 0xc1, 0x95, 0x50, 0xe2, 0xce, 0x4d, 0x98, 0x26, 0x63, + 0x1a, 0x6a, 0x72, 0xc2, 0xcc, 0xb4, 0x98, 0x17, 0x70, 0xed, 0x23, 0xf8, 0x30, 0x2e, 0xba, 0xec, + 0xd2, 0x55, 0x91, 0x76, 0xe3, 0xba, 0x2f, 0xa0, 0x64, 0x66, 0xfc, 0xd3, 0x5b, 0xc8, 0x6e, 0x72, + 0xf2, 0xfb, 0xbe, 0xf9, 0xce, 0x99, 0xa3, 0xf7, 0x81, 0x65, 0xc0, 0x52, 0xe6, 0x71, 0x58, 0x92, + 0xfc, 0x03, 0x8e, 0x38, 0xd0, 0xd2, 0x5b, 0x0f, 0xe6, 0x84, 0xe3, 0x81, 0x97, 0x90, 0x9c, 0xb0, + 0x94, 0xb9, 0x05, 0x05, 0x0e, 0xc6, 0x43, 0xc5, 0xba, 0xff, 0xb3, 0xae, 0x62, 0x3b, 0xf7, 0x13, + 0x48, 0x40, 0x80, 0x5e, 0x75, 0x92, 0x9a, 0xce, 0xa8, 0xd6, 0x1f, 0xaf, 0xf8, 0x02, 0x68, 0xca, + 0xcb, 0xb7, 0x84, 0xe3, 0x18, 0x73, 0xac, 0x54, 0xcf, 0x6a, 0x55, 0x05, 0xa6, 0x38, 0x53, 0xa1, + 0x9c, 0x6f, 0x48, 0x6f, 0xbd, 0x91, 0x31, 0xdf, 0x71, 0xcc, 0x89, 0xe1, 0xeb, 0x0d, 0x09, 0x98, + 0xa8, 0x8b, 0x7a, 0xcd, 0xe1, 0x13, 0xb7, 0x2e, 0xb6, 0x3b, 0x13, 0xac, 0x7f, 0xb5, 0xd9, 0xd9, + 0x5a, 0xa0, 0x94, 0x46, 0xa1, 0xdf, 0x56, 0x5c, 0x18, 0x93, 0x1c, 0x32, 0x66, 0x5e, 0x74, 0x2f, + 0x7b, 0xcd, 0x61, 0xbf, 0xde, 0x4b, 0xe5, 0x98, 0x56, 0x12, 0xff, 0x51, 0xe5, 0x78, 0xdc, 0xd9, + 0xed, 0x12, 0x67, 0x1f, 0xc7, 0xce, 0xa9, 0x9f, 0x13, 0xdc, 0x52, 0x85, 0xa9, 0xfc, 0xfe, 0xf5, + 0xaf, 0x0d, 0x51, 0x31, 0x9e, 0xea, 0x37, 0x04, 0x2a, 0xba, 0xb8, 0xe9, 0xdf, 0x39, 0xee, 0xec, + 0x96, 0x74, 0x12, 0x65, 0x27, 0x90, 0xbf, 0x8d, 0xcf, 0x48, 0x37, 0xfe, 0x8e, 0x31, 0xcc, 0xd4, + 0x1c, 0xcd, 0x0b, 0xd1, 0xfb, 0xa8, 0x3e, 0xaf, 0xb8, 0x69, 0x72, 0xfd, 0x0d, 0xfc, 0xc7, 0x2a, + 0xf9, 0x03, 0x79, 0xdf, 0xb9, 0xbb, 0x13, 0xdc, 0x3d, 0x7b, 0x39, 0xe3, 0x95, 0xde, 0x5e, 0x00, + 0x2c, 0xc3, 0x08, 0x72, 0x4e, 0x71, 0xc4, 0x43, 0x1c, 0xc7, 0x94, 0x30, 0x66, 0x5e, 0x8a, 0x06, + 0xaa, 0x01, 0xa3, 0xe0, 0x5e, 0x85, 0xbc, 0x56, 0xc4, 0x44, 0x02, 0xe3, 0xab, 0x9f, 0x5f, 0x6d, + 0xe4, 0xcf, 0x36, 0x7b, 0x0b, 0x6d, 0xf7, 0x16, 0xfa, 0xb1, 0xb7, 0xd0, 0x97, 0x83, 0xa5, 0x6d, + 0x0f, 0x96, 0xf6, 0xfd, 0x60, 0x69, 0xef, 0x5f, 0x26, 0x29, 0x5f, 0xac, 0xe6, 0x6e, 0x04, 0x99, + 0x97, 0x93, 0x15, 0xa7, 0x90, 0x3f, 0x07, 0x9a, 0xfc, 0x39, 0x7b, 0xeb, 0x91, 0xf7, 0xe9, 0x74, + 0x53, 0x78, 0x59, 0x10, 0x36, 0x6f, 0x88, 0x0d, 0x79, 0xf1, 0x3b, 0x00, 0x00, 0xff, 0xff, 0xcf, + 0xa7, 0x03, 0x49, 0xe4, 0x02, 0x00, 0x00, } func (this *GenesisDenom) Equal(that interface{}) bool { @@ -194,6 +205,9 @@ func (this *GenesisDenom) Equal(that interface{}) bool { if !this.AuthorityMetadata.Equal(&that1.AuthorityMetadata) { return false } + if this.HookContractAddress != that1.HookContractAddress { + return false + } return true } func (m *GenesisState) Marshal() (dAtA []byte, err error) { @@ -263,6 +277,13 @@ func (m *GenesisDenom) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.HookContractAddress) > 0 { + i -= len(m.HookContractAddress) + copy(dAtA[i:], m.HookContractAddress) + i = encodeVarintGenesis(dAtA, i, uint64(len(m.HookContractAddress))) + i-- + dAtA[i] = 0x1a + } { size, err := m.AuthorityMetadata.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -323,6 +344,10 @@ func (m *GenesisDenom) Size() (n int) { } l = m.AuthorityMetadata.Size() n += 1 + l + sovGenesis(uint64(l)) + l = len(m.HookContractAddress) + if l > 0 { + n += 1 + l + sovGenesis(uint64(l)) + } return n } @@ -543,6 +568,38 @@ func (m *GenesisDenom) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field HookContractAddress", 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.HookContractAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenesis(dAtA[iNdEx:]) From 033aefc6dd2f2d0a029168679e9e08b8b20431ed Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Thu, 20 Jun 2024 12:50:55 +0300 Subject: [PATCH 53/87] validate genesis --- x/tokenfactory/keeper/genesis.go | 6 ++++-- x/tokenfactory/types/errors.go | 23 +++++++++++---------- x/tokenfactory/types/genesis.go | 4 ++++ x/tokenfactory/types/genesis_test.go | 30 ++++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 13 deletions(-) diff --git a/x/tokenfactory/keeper/genesis.go b/x/tokenfactory/keeper/genesis.go index 7957edf90..f013f6ac0 100644 --- a/x/tokenfactory/keeper/genesis.go +++ b/x/tokenfactory/keeper/genesis.go @@ -39,8 +39,10 @@ func (k Keeper) InitGenesis(ctx sdk.Context, genState types.GenesisState) { panic(err) } - if err := k.setBeforeSendHook(ctx, genDenom.Denom, genDenom.HookContractAddress); err != nil { - panic(err) + if genDenom.HookContractAddress != "" { + if err := k.setBeforeSendHook(ctx, genDenom.Denom, genDenom.HookContractAddress); err != nil { + panic(err) + } } } } diff --git a/x/tokenfactory/types/errors.go b/x/tokenfactory/types/errors.go index c20e41980..2ade10b9d 100644 --- a/x/tokenfactory/types/errors.go +++ b/x/tokenfactory/types/errors.go @@ -8,15 +8,16 @@ import ( // x/tokenfactory module sentinel errors var ( - ErrDenomExists = errorsmod.Register(ModuleName, 2, "attempting to create a denom that already exists (has bank metadata)") - ErrUnauthorized = errorsmod.Register(ModuleName, 3, "unauthorized account") - ErrInvalidDenom = errorsmod.Register(ModuleName, 4, "invalid denom") - ErrInvalidCreator = errorsmod.Register(ModuleName, 5, "invalid creator") - ErrInvalidAuthorityMetadata = errorsmod.Register(ModuleName, 6, "invalid authority metadata") - ErrInvalidGenesis = errorsmod.Register(ModuleName, 7, "invalid genesis") - ErrSubdenomTooLong = errorsmod.Register(ModuleName, 8, fmt.Sprintf("subdenom too long, max length is %d bytes", MaxSubdenomLength)) - ErrCreatorTooLong = errorsmod.Register(ModuleName, 9, fmt.Sprintf("creator too long, max length is %d bytes", MaxCreatorLength)) - ErrDenomDoesNotExist = errorsmod.Register(ModuleName, 10, "denom does not exist") - ErrBurnFromModuleAccount = errorsmod.Register(ModuleName, 11, "burning from Module Account is not allowed") - ErrTrackBeforeSendOutOfGas = errorsmod.Register(ModuleName, 12, "gas meter hit maximum limit") + ErrDenomExists = errorsmod.Register(ModuleName, 2, "attempting to create a denom that already exists (has bank metadata)") + ErrUnauthorized = errorsmod.Register(ModuleName, 3, "unauthorized account") + ErrInvalidDenom = errorsmod.Register(ModuleName, 4, "invalid denom") + ErrInvalidCreator = errorsmod.Register(ModuleName, 5, "invalid creator") + ErrInvalidAuthorityMetadata = errorsmod.Register(ModuleName, 6, "invalid authority metadata") + ErrInvalidGenesis = errorsmod.Register(ModuleName, 7, "invalid genesis") + ErrSubdenomTooLong = errorsmod.Register(ModuleName, 8, fmt.Sprintf("subdenom too long, max length is %d bytes", MaxSubdenomLength)) + ErrCreatorTooLong = errorsmod.Register(ModuleName, 9, fmt.Sprintf("creator too long, max length is %d bytes", MaxCreatorLength)) + ErrDenomDoesNotExist = errorsmod.Register(ModuleName, 10, "denom does not exist") + ErrBurnFromModuleAccount = errorsmod.Register(ModuleName, 11, "burning from Module Account is not allowed") + ErrTrackBeforeSendOutOfGas = errorsmod.Register(ModuleName, 12, "gas meter hit maximum limit") + ErrInvalidHookContractAddress = errorsmod.Register(ModuleName, 13, "invalid hook contract address") ) diff --git a/x/tokenfactory/types/genesis.go b/x/tokenfactory/types/genesis.go index fc265c124..683f49df7 100644 --- a/x/tokenfactory/types/genesis.go +++ b/x/tokenfactory/types/genesis.go @@ -43,6 +43,10 @@ func (gs GenesisState) Validate() error { return errorsmod.Wrapf(ErrInvalidAuthorityMetadata, "Invalid admin address (%s)", err) } } + + if _, err := sdk.AccAddressFromBech32(denom.HookContractAddress); denom.HookContractAddress != "" && err != nil { + return errorsmod.Wrapf(ErrInvalidHookContractAddress, "Invalid hook contract address (%s)", err) + } } return nil diff --git a/x/tokenfactory/types/genesis_test.go b/x/tokenfactory/types/genesis_test.go index 7e19f69b7..e3039050b 100644 --- a/x/tokenfactory/types/genesis_test.go +++ b/x/tokenfactory/types/genesis_test.go @@ -130,6 +130,36 @@ func TestGenesisState_Validate(t *testing.T) { }, valid: false, }, + { + desc: "empty hook address", + genState: &types.GenesisState{ + FactoryDenoms: []types.GenesisDenom{ + { + Denom: "factory/neutron1m9l358xunhhwds0568za49mzhvuxx9ux8xafx2/bitcoin", + AuthorityMetadata: types.DenomAuthorityMetadata{ + Admin: "neutron1m9l358xunhhwds0568za49mzhvuxx9ux8xafx2", + }, + HookContractAddress: "", + }, + }, + }, + valid: true, + }, + { + desc: "invalid hook address", + genState: &types.GenesisState{ + FactoryDenoms: []types.GenesisDenom{ + { + Denom: "factory/neutron1m9l358xunhhwds0568za49mzhvuxx9ux8xafx2/bitcoin", + AuthorityMetadata: types.DenomAuthorityMetadata{ + Admin: "neutron1m9l358xunhhwds0568za49mzhvuxx9ux8xafx2", + }, + HookContractAddress: "sfsdfsdfsdfs", + }, + }, + }, + valid: false, + }, } { t.Run(tc.desc, func(t *testing.T) { err := tc.genState.Validate() From 40bde0650fed7330b617ee919368c7367c3cd0cc Mon Sep 17 00:00:00 2001 From: nhpd Date: Thu, 20 Jun 2024 14:19:22 +0400 Subject: [PATCH 54/87] fix inaccessible comment --- x/dex/types/pool.go | 1 - 1 file changed, 1 deletion(-) diff --git a/x/dex/types/pool.go b/x/dex/types/pool.go index 6e6ba1d07..3a167f5b4 100644 --- a/x/dex/types/pool.go +++ b/x/dex/types/pool.go @@ -248,7 +248,6 @@ func CalcGreatestMatchingRatio( targetAmount0Dec := math.LegacyNewDecFromInt(targetAmount0) targetAmount1Dec := math.LegacyNewDecFromInt(targetAmount1) - // See spec: https://www.notion.so/dualityxyz/Autoswap-Spec-e856fa7b2438403c95147010d479b98c if targetAmount1.GT(math.ZeroInt()) { resultAmount0 = math.MinInt( amount0, From 1816c0995fdea119b71f3d3c6818de3235484b0a Mon Sep 17 00:00:00 2001 From: Albert Andrejev Date: Thu, 20 Jun 2024 13:39:27 +0300 Subject: [PATCH 55/87] Allow ChannelClientState query --- wasmbinding/stargate_allowlist.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/wasmbinding/stargate_allowlist.go b/wasmbinding/stargate_allowlist.go index 2a6bfc65b..13d8ab761 100644 --- a/wasmbinding/stargate_allowlist.go +++ b/wasmbinding/stargate_allowlist.go @@ -8,6 +8,7 @@ import ( ibctransfertypes "github.com/cosmos/ibc-go/v8/modules/apps/transfer/types" ibcclienttypes "github.com/cosmos/ibc-go/v8/modules/core/02-client/types" //nolint:staticcheck ibcconnectiontypes "github.com/cosmos/ibc-go/v8/modules/core/03-connection/types" + ibcchanneltypes "github.com/cosmos/ibc-go/v8/modules/core/04-channel/types" feemarkettypes "github.com/skip-mev/feemarket/x/feemarket/types" marketmaptypes "github.com/skip-mev/slinky/x/marketmap/types" oracletypes "github.com/skip-mev/slinky/x/oracle/types" @@ -25,9 +26,10 @@ import ( func AcceptedStargateQueries() wasmkeeper.AcceptedQueries { return wasmkeeper.AcceptedQueries{ // ibc - "/ibc.core.client.v1.Query/ClientState": &ibcclienttypes.QueryClientStateResponse{}, - "/ibc.core.client.v1.Query/ConsensusState": &ibcclienttypes.QueryConsensusStateResponse{}, - "/ibc.core.connection.v1.Query/Connection": &ibcconnectiontypes.QueryConnectionResponse{}, + "/ibc.core.client.v1.Query/ClientState": &ibcclienttypes.QueryClientStateResponse{}, + "/ibc.core.client.v1.Query/ConsensusState": &ibcclienttypes.QueryConsensusStateResponse{}, + "/ibc.core.connection.v1.Query/Connection": &ibcconnectiontypes.QueryConnectionResponse{}, + "/ibc.core.channel.v1.Query/ChannelClientState": &ibcchanneltypes.QueryChannelClientStateResponse{}, // token factory "/osmosis.tokenfactory.v1beta1.Query/Params": &tokenfactorytypes.QueryParamsResponse{}, From b5d02d424ccd054e95d2ed2be292bb868258e63a Mon Sep 17 00:00:00 2001 From: Julian Compagni Portis Date: Thu, 20 Jun 2024 12:56:29 -0400 Subject: [PATCH 56/87] PR review fixes --- x/tokenfactory/keeper/before_send.go | 26 +++++++++++++++++++++++++- x/tokenfactory/keeper/params.go | 21 --------------------- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/x/tokenfactory/keeper/before_send.go b/x/tokenfactory/keeper/before_send.go index 014140d0d..ea592478b 100644 --- a/x/tokenfactory/keeper/before_send.go +++ b/x/tokenfactory/keeper/before_send.go @@ -68,6 +68,27 @@ func (k Keeper) Hooks() Hooks { return Hooks{k} } +func (k Keeper) AssertIsHookWhitelisted(ctx sdk.Context, denom string, contractAddress sdk.AccAddress) error { + contractInfo := k.contractKeeper.GetContractInfo(ctx, contractAddress) + if contractInfo == nil { + return types.ErrBeforeSendHookNotWhitelisted.Wrapf("contract with address (%s) does not exist", contractAddress.String()) + } + codeID := contractInfo.CodeID + whitelistedHooks := k.GetParams(ctx).WhitelistedHooks + denomCreator, _, err := types.DeconstructDenom(denom) + if err != nil { + return types.ErrBeforeSendHookNotWhitelisted.Wrapf("invalid denom: %s", denom) + } + + for _, hook := range whitelistedHooks { + if hook.CodeID == codeID && hook.DenomCreator == denomCreator { + return nil + } + } + + return types.ErrBeforeSendHookNotWhitelisted.Wrapf("no whitelist for contract with codeID (%d) and denomCreator (%s) ", codeID, denomCreator) +} + // TrackBeforeSend calls the before send listener contract suppresses any errors func (h Hooks) TrackBeforeSend(ctx context.Context, from, to sdk.AccAddress, amount sdk.Coins) { _ = h.k.callBeforeSendListener(ctx, from, to, amount, false) @@ -100,8 +121,11 @@ func (k Keeper) callBeforeSendListener(ctx context.Context, from, to sdk.AccAddr } // Do not invoke hook if denom is not whitelisted + // NOTE: hooks must already be whitelisted before they can be added, so under normal operation this check should never fail. + // It is here as an emergency override if we want to shutoff a hook. We do not return the error because once it is removed from the whitelist + // a hook should not be able to block a send. if err := k.AssertIsHookWhitelisted(c, coin.Denom, cwAddr); err != nil { - return nil + continue } var msgBz []byte diff --git a/x/tokenfactory/keeper/params.go b/x/tokenfactory/keeper/params.go index 4c97b9018..4faa1764d 100644 --- a/x/tokenfactory/keeper/params.go +++ b/x/tokenfactory/keeper/params.go @@ -29,24 +29,3 @@ func (k Keeper) SetParams(ctx sdk.Context, params types.Params) error { store.Set(types.ParamsKey, bz) return nil } - -func (k Keeper) AssertIsHookWhitelisted(ctx sdk.Context, denom string, contractAddress sdk.AccAddress) error { - contractInfo := k.contractKeeper.GetContractInfo(ctx, contractAddress) - if contractInfo == nil { - return types.ErrBeforeSendHookNotWhitelisted.Wrapf("contract with address (%s) does not exist", contractAddress.String()) - } - codeID := contractInfo.CodeID - whitelistedHooks := k.GetParams(ctx).WhitelistedHooks - denomCreator, _, err := types.DeconstructDenom(denom) - if err != nil { - return types.ErrBeforeSendHookNotWhitelisted.Wrapf("invalid denom: %s", denom) - } - - for _, hook := range whitelistedHooks { - if hook.CodeID == codeID && hook.DenomCreator == denomCreator { - return nil - } - } - - return types.ErrBeforeSendHookNotWhitelisted.Wrapf("no whitelist for contract with codeID (%d) and denomCreator (%s) ", codeID, denomCreator) -} From 01622b6a0d3244b1ab82e7306a4d702faedb8101 Mon Sep 17 00:00:00 2001 From: Julian Compagni Portis Date: Thu, 20 Jun 2024 14:03:07 -0400 Subject: [PATCH 57/87] small migration fixes --- x/tokenfactory/migrations/v2/store.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/x/tokenfactory/migrations/v2/store.go b/x/tokenfactory/migrations/v2/store.go index 408317c17..3c0588837 100644 --- a/x/tokenfactory/migrations/v2/store.go +++ b/x/tokenfactory/migrations/v2/store.go @@ -6,10 +6,10 @@ import ( "cosmossdk.io/store/prefix" + errorsmod "cosmossdk.io/errors" storetypes "cosmossdk.io/store/types" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/neutron-org/neutron/v4/x/tokenfactory/types" v1beta1types "github.com/neutron-org/neutron/v4/x/tokenfactory/types/v1beta1" ) @@ -84,6 +84,9 @@ func migrateHooks(ctx sdk.Context, storeKey storetypes.StoreKey, keeper TokenFac for ; iterator.Valid(); iterator.Next() { keyParts := strings.Split(string(iterator.Key()), types.KeySeparator) + if len(keyParts) != 3 { + return errors.New("cannot parse BeforeSendHook data") + } // Hooks and authorityMetadata are in the same store, we only care about the hooks if keyParts[2] == types.BeforeSendHookAddressPrefixKey { @@ -103,7 +106,7 @@ func migrateHooks(ctx sdk.Context, storeKey storetypes.StoreKey, keeper TokenFac err := iterator.Close() if err != nil { - return err + return errorsmod.Wrap(err, "iterator failed to close after migration") } ctx.Logger().Info("Finished migrating tokenfactory hooks") From 33b28465862c90fe9b8253fc910f545fa05fc3cb Mon Sep 17 00:00:00 2001 From: Julian Compagni Portis Date: Thu, 20 Jun 2024 14:12:11 -0400 Subject: [PATCH 58/87] fix: dont write during iterations --- x/tokenfactory/migrations/v2/store.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/x/tokenfactory/migrations/v2/store.go b/x/tokenfactory/migrations/v2/store.go index 3c0588837..037dcb432 100644 --- a/x/tokenfactory/migrations/v2/store.go +++ b/x/tokenfactory/migrations/v2/store.go @@ -81,7 +81,7 @@ func migrateHooks(ctx sdk.Context, storeKey storetypes.StoreKey, keeper TokenFac // get hook store store := prefix.NewStore(ctx.KVStore(storeKey), []byte(types.DenomsPrefixKey)) iterator := storetypes.KVStorePrefixIterator(store, []byte{}) - + hooksToRemove := make([][]byte, 0) for ; iterator.Valid(); iterator.Next() { keyParts := strings.Split(string(iterator.Key()), types.KeySeparator) if len(keyParts) != 3 { @@ -98,8 +98,7 @@ func migrateHooks(ctx sdk.Context, storeKey storetypes.StoreKey, keeper TokenFac err = keeper.AssertIsHookWhitelisted(ctx, denom, contractAddr) if err != nil { - // If hook is not whitelisted delete it - store.Delete(iterator.Key()) + hooksToRemove = append(hooksToRemove, iterator.Key()) } } } @@ -109,6 +108,11 @@ func migrateHooks(ctx sdk.Context, storeKey storetypes.StoreKey, keeper TokenFac return errorsmod.Wrap(err, "iterator failed to close after migration") } + // Delete all non-whitelisted hooks + for _, k := range hooksToRemove { + store.Delete(k) + } + ctx.Logger().Info("Finished migrating tokenfactory hooks") return nil From 024ce3d6fc3cf8e57031f6ae104900ce95530efa Mon Sep 17 00:00:00 2001 From: Julian Compagni Portis Date: Thu, 20 Jun 2024 14:17:52 -0400 Subject: [PATCH 59/87] lint --- x/tokenfactory/migrations/v2/store.go | 1 + 1 file changed, 1 insertion(+) diff --git a/x/tokenfactory/migrations/v2/store.go b/x/tokenfactory/migrations/v2/store.go index 037dcb432..9a34e5f11 100644 --- a/x/tokenfactory/migrations/v2/store.go +++ b/x/tokenfactory/migrations/v2/store.go @@ -10,6 +10,7 @@ import ( storetypes "cosmossdk.io/store/types" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/neutron-org/neutron/v4/x/tokenfactory/types" v1beta1types "github.com/neutron-org/neutron/v4/x/tokenfactory/types/v1beta1" ) From b42c0d7189aedc2630285c7909dd3555b47bcd7a Mon Sep 17 00:00:00 2001 From: Julian Compagni Portis Date: Thu, 20 Jun 2024 14:43:58 -0400 Subject: [PATCH 60/87] don't write during iteration also wrap errors --- x/dex/migrations/v3/store.go | 39 ++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/x/dex/migrations/v3/store.go b/x/dex/migrations/v3/store.go index 1f3079a46..3afae19a8 100644 --- a/x/dex/migrations/v3/store.go +++ b/x/dex/migrations/v3/store.go @@ -3,6 +3,7 @@ package v3 import ( "errors" + errorsmod "cosmossdk.io/errors" "cosmossdk.io/store/prefix" storetypes "cosmossdk.io/store/types" "github.com/cosmos/cosmos-sdk/codec" @@ -84,7 +85,7 @@ func migrateLimitOrderExpirations(ctx sdk.Context, cdc codec.BinaryCodec, storeK err := iterator.Close() if err != nil { - return err + return errorsmod.Wrap(err, "iterator failed to close during migration") } for i, key := range expirationKeys { @@ -105,6 +106,11 @@ func migrateLimitOrderExpirations(ctx sdk.Context, cdc codec.BinaryCodec, storeK return nil } +type migrationUpdate struct { + key []byte + val []byte +} + func migrateTickLiquidityPrices(ctx sdk.Context, cdc codec.BinaryCodec, storeKey storetypes.StoreKey) error { // Due to change in precision of PrecDec between v2 and v3 we need to recompute all PrecDecs in the kvstore ctx.Logger().Info("Migrating TickLiquidity Prices...") @@ -112,12 +118,13 @@ func migrateTickLiquidityPrices(ctx sdk.Context, cdc codec.BinaryCodec, storeKey // Iterate through all tickLiquidity store := prefix.NewStore(ctx.KVStore(storeKey), types.KeyPrefix(types.TickLiquidityKeyPrefix)) iterator := storetypes.KVStorePrefixIterator(store, []byte{}) + ticksToUpdate := make([]migrationUpdate, 0) for ; iterator.Valid(); iterator.Next() { var tickLiq types.TickLiquidity var updatedTickLiq types.TickLiquidity cdc.MustUnmarshal(iterator.Value(), &tickLiq) - // Recalculate all prices by precisionUpdateMultiplier + // Recalculate all prices switch liquidity := tickLiq.Liquidity.(type) { case *types.TickLiquidity_LimitOrderTranche: liquidity.LimitOrderTranche.PriceTakerToMaker = types.MustCalcPrice(liquidity.LimitOrderTranche.Key.TickIndexTakerToMaker) @@ -131,14 +138,20 @@ func migrateTickLiquidityPrices(ctx sdk.Context, cdc codec.BinaryCodec, storeKey default: panic("Tick does not contain valid liqudityType") } - // Store the updated tickLiquidity + bz := cdc.MustMarshal(&updatedTickLiq) - store.Set(iterator.Key(), bz) + ticksToUpdate = append(ticksToUpdate, migrationUpdate{key: iterator.Key(), val: bz}) + } err := iterator.Close() if err != nil { - return err + return errorsmod.Wrap(err, "iterator failed to close during migration") + } + + // Store the updated TickLiquidity + for _, v := range ticksToUpdate { + store.Set(v.key, v.val) } ctx.Logger().Info("Finished migrating TickLiquidity Prices...") @@ -150,25 +163,29 @@ func migrateInactiveTranchePrices(ctx sdk.Context, cdc codec.BinaryCodec, storeK // Due to change in precision of PrecDec between v2 and v3 we need to recompute all PrecDecs in the kvstore ctx.Logger().Info("Migrating InactiveLimitOrderTranche Prices...") - // Iterate through all tickLiquidity + // Iterate through all InactiveTranches store := prefix.NewStore(ctx.KVStore(storeKey), types.KeyPrefix(types.InactiveLimitOrderTrancheKeyPrefix)) iterator := storetypes.KVStorePrefixIterator(store, []byte{}) + ticksToUpdate := make([]migrationUpdate, 0) for ; iterator.Valid(); iterator.Next() { var tranche types.LimitOrderTranche cdc.MustUnmarshal(iterator.Value(), &tranche) - // Multiply all price by precisionUpdateMultiplier - + // Recalculate price tranche.PriceTakerToMaker = types.MustCalcPrice(tranche.Key.TickIndexTakerToMaker) - // Store the updated tickLiquidity bz := cdc.MustMarshal(&tranche) - store.Set(iterator.Key(), bz) + ticksToUpdate = append(ticksToUpdate, migrationUpdate{key: iterator.Key(), val: bz}) } err := iterator.Close() if err != nil { - return err + return errorsmod.Wrap(err, "iterator failed to close during migration") + } + + // Store the updated InactiveTranches + for _, v := range ticksToUpdate { + store.Set(v.key, v.val) } ctx.Logger().Info("Finished migrating InactiveLimitOrderTranche Prices...") From 36fd28a57908934c5ae2c3d9aa1cca346c8b3afb Mon Sep 17 00:00:00 2001 From: Julian Compagni Portis Date: Thu, 20 Jun 2024 15:10:16 -0400 Subject: [PATCH 61/87] Add error logging for skipped hooks --- x/tokenfactory/keeper/before_send.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/x/tokenfactory/keeper/before_send.go b/x/tokenfactory/keeper/before_send.go index ea592478b..cf471a497 100644 --- a/x/tokenfactory/keeper/before_send.go +++ b/x/tokenfactory/keeper/before_send.go @@ -125,6 +125,12 @@ func (k Keeper) callBeforeSendListener(ctx context.Context, from, to sdk.AccAddr // It is here as an emergency override if we want to shutoff a hook. We do not return the error because once it is removed from the whitelist // a hook should not be able to block a send. if err := k.AssertIsHookWhitelisted(c, coin.Denom, cwAddr); err != nil { + c.Logger().Error( + "Skipped hook execution due to missing whitelist", + "err", err, + "denom", coin.Amount, + "contract", cwAddr.String(), + ) continue } From 2c7fb7d92ccd243075b0deb1cbbe726215f232ad Mon Sep 17 00:00:00 2001 From: Julian Compagni Portis Date: Thu, 20 Jun 2024 19:05:26 -0400 Subject: [PATCH 62/87] Add whitelisted astroport contracts to TF migration --- x/tokenfactory/migrations/v2/store.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/x/tokenfactory/migrations/v2/store.go b/x/tokenfactory/migrations/v2/store.go index 9a34e5f11..96a69f144 100644 --- a/x/tokenfactory/migrations/v2/store.go +++ b/x/tokenfactory/migrations/v2/store.go @@ -38,6 +38,14 @@ var WhitelistedHooks = []*types.WhitelistedHook{ CodeID: 944, DenomCreator: "neutron1zlf3hutsa4qnmue53lz2tfxrutp8y2e3rj4nkghg3rupgl4mqy8s5jgxsn", }, + { // USDC <> NTRN balances tracker + CodeID: 944, + DenomCreator: "neutron18c8qejysp4hgcfuxdpj4wf29mevzwllz5yh8uayjxamwtrs0n9fshq9vtv", + }, + { // NTRN <> ATOM balances tracker + CodeID: 944, + DenomCreator: "neutron145z3nj7yqft2vpugr5a5p7jsnagvms90tvtej45g4s0xkqalhy7sj20vgz", + }, { // NFA.zoneV1 CodeID: 1265, DenomCreator: "neutron1pwjn3tsumm3j7v7clzqhjsaukv4tdjlclhdytawhet68fwlz84fqcrdyf5", From 01c1923a1dc7fc41c0cc04d08d49f3dba8bf9069 Mon Sep 17 00:00:00 2001 From: Julian Compagni Portis Date: Thu, 20 Jun 2024 19:33:27 -0400 Subject: [PATCH 63/87] Add missing comma in init-neutrond.sh --- network/init-neutrond.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/network/init-neutrond.sh b/network/init-neutrond.sh index ec671d986..563572a2b 100755 --- a/network/init-neutrond.sh +++ b/network/init-neutrond.sh @@ -721,7 +721,7 @@ echo $DAO_CONTRACT_ADDRESS_B64 set_genesis_param admins "[\"$NEUTRON_CHAIN_MANAGER_CONTRACT_ADDRESS\"]" # admin module set_genesis_param treasury_address "\"$DAO_CONTRACT_ADDRESS\"" # feeburner -set_genesis_param fee_collector_address "\"$DAO_CONTRACT_ADDRESS\"" # tokenfactory +set_genesis_param fee_collector_address "\"$DAO_CONTRACT_ADDRESS\"," # tokenfactory set_genesis_param security_address "\"$SECURITY_SUBDAO_CORE_CONTRACT_ADDRESS\"," # cron set_genesis_param limit 5 # cron #set_genesis_param allow_messages "[\"*\"]" # interchainaccounts From a097ad9d522d6813ad3dbdb55e14206dfb284ac1 Mon Sep 17 00:00:00 2001 From: Julian Compagni Portis Date: Thu, 20 Jun 2024 21:40:18 -0400 Subject: [PATCH 64/87] better comments on TF params.proto --- docs/static/swagger.yaml | 43 +++++++++++++++++++++---- proto/osmosis/tokenfactory/params.proto | 5 ++- x/tokenfactory/types/params.pb.go | 5 ++- 3 files changed, 45 insertions(+), 8 deletions(-) diff --git a/docs/static/swagger.yaml b/docs/static/swagger.yaml index a10ae098e..a533cb0fa 100644 --- a/docs/static/swagger.yaml +++ b/docs/static/swagger.yaml @@ -18684,10 +18684,18 @@ definitions: type: string denom_creator: type: string + title: >- + WhitelistedHook describes a beforeSendHook which is allowed to be + added and executed + + SetBeforeSendHook can only be called on denoms where the denom + creator and + + code_id for the `contract_addr` match a WhitelistedHook type: object title: >- - HookWhitelist is the list of hooks which are allowed to be added and - executed + whitelisted_hooks is the list of hooks which are allowed to be added + and executed type: array type: object osmosis.tokenfactory.WhitelistedHook: @@ -18697,6 +18705,13 @@ definitions: type: string denom_creator: type: string + title: >- + WhitelistedHook describes a beforeSendHook which is allowed to be added + and executed + + SetBeforeSendHook can only be called on denoms where the denom creator and + + code_id for the `contract_addr` match a WhitelistedHook type: object osmosis.tokenfactory.v1beta1.DenomAuthorityMetadata: description: |- @@ -18803,10 +18818,18 @@ definitions: type: string denom_creator: type: string + title: >- + WhitelistedHook describes a beforeSendHook which is allowed to + be added and executed + + SetBeforeSendHook can only be called on denoms where the denom + creator and + + code_id for the `contract_addr` match a WhitelistedHook type: object title: >- - HookWhitelist is the list of hooks which are allowed to be added - and executed + whitelisted_hooks is the list of hooks which are allowed to be + added and executed type: array type: object type: object @@ -43784,10 +43807,18 @@ paths: type: string denom_creator: type: string + title: >- + WhitelistedHook describes a beforeSendHook which is + allowed to be added and executed + + SetBeforeSendHook can only be called on denoms where the + denom creator and + + code_id for the `contract_addr` match a WhitelistedHook type: object title: >- - HookWhitelist is the list of hooks which are allowed to be - added and executed + whitelisted_hooks is the list of hooks which are allowed + to be added and executed type: array type: object type: object diff --git a/proto/osmosis/tokenfactory/params.proto b/proto/osmosis/tokenfactory/params.proto index ef7a36f6d..563a17a4f 100644 --- a/proto/osmosis/tokenfactory/params.proto +++ b/proto/osmosis/tokenfactory/params.proto @@ -7,6 +7,9 @@ import "gogoproto/gogo.proto"; option go_package = "github.com/neutron-org/neutron/v4/x/tokenfactory/types"; +// WhitelistedHook describes a beforeSendHook which is allowed to be added and executed +// SetBeforeSendHook can only be called on denoms where the denom creator and +// code_id for the `contract_addr` match a WhitelistedHook message WhitelistedHook { uint64 code_id = 1 [(gogoproto.customname) = "CodeID"]; string denom_creator = 2; @@ -35,6 +38,6 @@ message Params { // FeeCollectorAddress is the address where fees collected from denom creation // are sent to string fee_collector_address = 3; - // HookWhitelist is the list of hooks which are allowed to be added and executed + // whitelisted_hooks is the list of hooks which are allowed to be added and executed repeated WhitelistedHook whitelisted_hooks = 4; } diff --git a/x/tokenfactory/types/params.pb.go b/x/tokenfactory/types/params.pb.go index 6138df390..48cfdb88f 100644 --- a/x/tokenfactory/types/params.pb.go +++ b/x/tokenfactory/types/params.pb.go @@ -27,6 +27,9 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +// WhitelistedHook describes a beforeSendHook which is allowed to be added and executed +// SetBeforeSendHook can only be called on denoms where the denom creator and +// code_id for the `contract_addr` match a WhitelistedHook type WhitelistedHook struct { CodeID uint64 `protobuf:"varint,1,opt,name=code_id,json=codeId,proto3" json:"code_id,omitempty"` DenomCreator string `protobuf:"bytes,2,opt,name=denom_creator,json=denomCreator,proto3" json:"denom_creator,omitempty"` @@ -93,7 +96,7 @@ type Params struct { // FeeCollectorAddress is the address where fees collected from denom creation // are sent to FeeCollectorAddress string `protobuf:"bytes,3,opt,name=fee_collector_address,json=feeCollectorAddress,proto3" json:"fee_collector_address,omitempty"` - // HookWhitelist is the list of hooks which are allowed to be added and executed + // whitelisted_hooks is the list of hooks which are allowed to be added and executed WhitelistedHooks []*WhitelistedHook `protobuf:"bytes,4,rep,name=whitelisted_hooks,json=whitelistedHooks,proto3" json:"whitelisted_hooks,omitempty"` } From 56b0ff77ef3841eef69835fa67caf800f90cda33 Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Fri, 21 Jun 2024 13:37:17 +0300 Subject: [PATCH 65/87] move migrateTickLiquidityPrices and migrateInactiveTranchePrices to another (v4) consensus migration to simplify testnet migration --- x/dex/keeper/migrations.go | 6 ++ x/dex/migrations/v3/store.go | 96 ------------------------- x/dex/migrations/v3/store_test.go | 53 -------------- x/dex/migrations/v4/store.go | 112 ++++++++++++++++++++++++++++++ x/dex/migrations/v4/store_test.go | 73 +++++++++++++++++++ x/dex/module.go | 4 ++ 6 files changed, 195 insertions(+), 149 deletions(-) create mode 100644 x/dex/migrations/v4/store.go create mode 100644 x/dex/migrations/v4/store_test.go diff --git a/x/dex/keeper/migrations.go b/x/dex/keeper/migrations.go index f08b14797..ef9a8c2bb 100644 --- a/x/dex/keeper/migrations.go +++ b/x/dex/keeper/migrations.go @@ -4,6 +4,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" v3 "github.com/neutron-org/neutron/v4/x/dex/migrations/v3" + v4 "github.com/neutron-org/neutron/v4/x/dex/migrations/v4" ) // Migrator is a struct for handling in-place store migrations. @@ -20,3 +21,8 @@ func NewMigrator(keeper Keeper) Migrator { func (m Migrator) Migrate2to3(ctx sdk.Context) error { return v3.MigrateStore(ctx, m.keeper.cdc, m.keeper.storeKey) } + +// Migrate2to3 migrates from version 3 to 4. +func (m Migrator) Migrate3to4(ctx sdk.Context) error { + return v4.MigrateStore(ctx, m.keeper.cdc, m.keeper.storeKey) +} diff --git a/x/dex/migrations/v3/store.go b/x/dex/migrations/v3/store.go index 3afae19a8..bb26392f1 100644 --- a/x/dex/migrations/v3/store.go +++ b/x/dex/migrations/v3/store.go @@ -23,15 +23,6 @@ func MigrateStore(ctx sdk.Context, cdc codec.BinaryCodec, storeKey storetypes.St if err := migrateLimitOrderExpirations(ctx, cdc, storeKey); err != nil { return err } - - if err := migrateTickLiquidityPrices(ctx, cdc, storeKey); err != nil { - return err - } - - if err := migrateInactiveTranchePrices(ctx, cdc, storeKey); err != nil { - return err - } - return nil } @@ -105,90 +96,3 @@ func migrateLimitOrderExpirations(ctx sdk.Context, cdc codec.BinaryCodec, storeK return nil } - -type migrationUpdate struct { - key []byte - val []byte -} - -func migrateTickLiquidityPrices(ctx sdk.Context, cdc codec.BinaryCodec, storeKey storetypes.StoreKey) error { - // Due to change in precision of PrecDec between v2 and v3 we need to recompute all PrecDecs in the kvstore - ctx.Logger().Info("Migrating TickLiquidity Prices...") - - // Iterate through all tickLiquidity - store := prefix.NewStore(ctx.KVStore(storeKey), types.KeyPrefix(types.TickLiquidityKeyPrefix)) - iterator := storetypes.KVStorePrefixIterator(store, []byte{}) - ticksToUpdate := make([]migrationUpdate, 0) - - for ; iterator.Valid(); iterator.Next() { - var tickLiq types.TickLiquidity - var updatedTickLiq types.TickLiquidity - cdc.MustUnmarshal(iterator.Value(), &tickLiq) - // Recalculate all prices - switch liquidity := tickLiq.Liquidity.(type) { - case *types.TickLiquidity_LimitOrderTranche: - liquidity.LimitOrderTranche.PriceTakerToMaker = types.MustCalcPrice(liquidity.LimitOrderTranche.Key.TickIndexTakerToMaker) - updatedTickLiq = types.TickLiquidity{Liquidity: liquidity} - case *types.TickLiquidity_PoolReserves: - poolReservesKey := liquidity.PoolReserves.Key - liquidity.PoolReserves.PriceTakerToMaker = types.MustCalcPrice(poolReservesKey.TickIndexTakerToMaker) - liquidity.PoolReserves.PriceOppositeTakerToMaker = poolReservesKey.Counterpart().MustPriceTakerToMaker() - updatedTickLiq = types.TickLiquidity{Liquidity: liquidity} - - default: - panic("Tick does not contain valid liqudityType") - } - - bz := cdc.MustMarshal(&updatedTickLiq) - ticksToUpdate = append(ticksToUpdate, migrationUpdate{key: iterator.Key(), val: bz}) - - } - - err := iterator.Close() - if err != nil { - return errorsmod.Wrap(err, "iterator failed to close during migration") - } - - // Store the updated TickLiquidity - for _, v := range ticksToUpdate { - store.Set(v.key, v.val) - } - - ctx.Logger().Info("Finished migrating TickLiquidity Prices...") - - return nil -} - -func migrateInactiveTranchePrices(ctx sdk.Context, cdc codec.BinaryCodec, storeKey storetypes.StoreKey) error { - // Due to change in precision of PrecDec between v2 and v3 we need to recompute all PrecDecs in the kvstore - ctx.Logger().Info("Migrating InactiveLimitOrderTranche Prices...") - - // Iterate through all InactiveTranches - store := prefix.NewStore(ctx.KVStore(storeKey), types.KeyPrefix(types.InactiveLimitOrderTrancheKeyPrefix)) - iterator := storetypes.KVStorePrefixIterator(store, []byte{}) - ticksToUpdate := make([]migrationUpdate, 0) - - for ; iterator.Valid(); iterator.Next() { - var tranche types.LimitOrderTranche - cdc.MustUnmarshal(iterator.Value(), &tranche) - // Recalculate price - tranche.PriceTakerToMaker = types.MustCalcPrice(tranche.Key.TickIndexTakerToMaker) - - bz := cdc.MustMarshal(&tranche) - ticksToUpdate = append(ticksToUpdate, migrationUpdate{key: iterator.Key(), val: bz}) - } - - err := iterator.Close() - if err != nil { - return errorsmod.Wrap(err, "iterator failed to close during migration") - } - - // Store the updated InactiveTranches - for _, v := range ticksToUpdate { - store.Set(v.key, v.val) - } - - ctx.Logger().Info("Finished migrating InactiveLimitOrderTranche Prices...") - - return nil -} diff --git a/x/dex/migrations/v3/store_test.go b/x/dex/migrations/v3/store_test.go index 5f9e4a7ba..7dc44dc37 100644 --- a/x/dex/migrations/v3/store_test.go +++ b/x/dex/migrations/v3/store_test.go @@ -117,56 +117,3 @@ func (suite *V3DexMigrationTestSuite) TestLimitOrderExpirationUpgrade() { allExp := app.DexKeeper.GetAllLimitOrderExpiration(ctx) suite.Require().Equal(len(lOExpirations), len(allExp)) } - -func (suite *V3DexMigrationTestSuite) TestPriceUpdates() { - var ( - app = suite.GetNeutronZoneApp(suite.ChainA) - storeKey = app.GetKey(types.StoreKey) - ctx = suite.ChainA.GetContext() - cdc = app.AppCodec() - ) - - // Write tranche with incorrect price - trancheKey := &types.LimitOrderTrancheKey{ - TradePairId: types.MustNewTradePairID("TokenA", "TokenB"), - TickIndexTakerToMaker: -50, - TrancheKey: "123", - } - tranche := &types.LimitOrderTranche{ - Key: trancheKey, - PriceTakerToMaker: math.ZeroPrecDec(), - } - app.DexKeeper.SetLimitOrderTranche(ctx, tranche) - - // also create inactive tranche - app.DexKeeper.SetInactiveLimitOrderTranche(ctx, tranche) - - // Write poolReserves with incorrect prices - poolKey := &types.PoolReservesKey{ - TradePairId: types.MustNewTradePairID("TokenA", "TokenB"), - TickIndexTakerToMaker: 60000, - Fee: 1, - } - poolReserves := &types.PoolReserves{ - Key: poolKey, - PriceTakerToMaker: math.ZeroPrecDec(), - PriceOppositeTakerToMaker: math.ZeroPrecDec(), - } - app.DexKeeper.SetPoolReserves(ctx, poolReserves) - - // Run migration - suite.NoError(v3.MigrateStore(ctx, cdc, storeKey)) - - // Check LimitOrderTranche has correct price - newTranche := app.DexKeeper.GetLimitOrderTranche(ctx, trancheKey) - suite.True(newTranche.PriceTakerToMaker.Equal(math.MustNewPrecDecFromStr("1.005012269623051203500693815"))) - - // check InactiveLimitOrderTranche has correct price - inactiveTranche, _ := app.DexKeeper.GetInactiveLimitOrderTranche(ctx, trancheKey) - suite.True(inactiveTranche.PriceTakerToMaker.Equal(math.MustNewPrecDecFromStr("1.005012269623051203500693815"))) - - // Check PoolReserves has the correct prices - newPool, _ := app.DexKeeper.GetPoolReserves(ctx, poolKey) - suite.True(newPool.PriceTakerToMaker.Equal(math.MustNewPrecDecFromStr("0.002479495864288162666675923"))) - suite.True(newPool.PriceOppositeTakerToMaker.Equal(math.MustNewPrecDecFromStr("403.227141612124702272520931931"))) -} diff --git a/x/dex/migrations/v4/store.go b/x/dex/migrations/v4/store.go new file mode 100644 index 000000000..89766ff25 --- /dev/null +++ b/x/dex/migrations/v4/store.go @@ -0,0 +1,112 @@ +package v4 + +import ( + errorsmod "cosmossdk.io/errors" + "cosmossdk.io/store/prefix" + storetypes "cosmossdk.io/store/types" + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/neutron-org/neutron/v4/x/dex/types" +) + +// MigrateStore performs in-place store migrations. +// The migration adds new dex params -- GoodTilPurgeAllowance & MaxJITsPerBlock// for handling JIT orders. +func MigrateStore(ctx sdk.Context, cdc codec.BinaryCodec, storeKey storetypes.StoreKey) error { + if err := migrateTickLiquidityPrices(ctx, cdc, storeKey); err != nil { + return err + } + + if err := migrateInactiveTranchePrices(ctx, cdc, storeKey); err != nil { + return err + } + + return nil +} + +type migrationUpdate struct { + key []byte + val []byte +} + +func migrateTickLiquidityPrices(ctx sdk.Context, cdc codec.BinaryCodec, storeKey storetypes.StoreKey) error { + // Due to change in precision of PrecDec between v2 and v3 we need to recompute all PrecDecs in the kvstore + ctx.Logger().Info("Migrating TickLiquidity Prices...") + + // Iterate through all tickLiquidity + store := prefix.NewStore(ctx.KVStore(storeKey), types.KeyPrefix(types.TickLiquidityKeyPrefix)) + iterator := storetypes.KVStorePrefixIterator(store, []byte{}) + ticksToUpdate := make([]migrationUpdate, 0) + + for ; iterator.Valid(); iterator.Next() { + var tickLiq types.TickLiquidity + var updatedTickLiq types.TickLiquidity + cdc.MustUnmarshal(iterator.Value(), &tickLiq) + // Recalculate all prices + switch liquidity := tickLiq.Liquidity.(type) { + case *types.TickLiquidity_LimitOrderTranche: + liquidity.LimitOrderTranche.PriceTakerToMaker = types.MustCalcPrice(liquidity.LimitOrderTranche.Key.TickIndexTakerToMaker) + updatedTickLiq = types.TickLiquidity{Liquidity: liquidity} + case *types.TickLiquidity_PoolReserves: + poolReservesKey := liquidity.PoolReserves.Key + liquidity.PoolReserves.PriceTakerToMaker = types.MustCalcPrice(poolReservesKey.TickIndexTakerToMaker) + liquidity.PoolReserves.PriceOppositeTakerToMaker = poolReservesKey.Counterpart().MustPriceTakerToMaker() + updatedTickLiq = types.TickLiquidity{Liquidity: liquidity} + + default: + panic("Tick does not contain valid liqudityType") + } + + bz := cdc.MustMarshal(&updatedTickLiq) + ticksToUpdate = append(ticksToUpdate, migrationUpdate{key: iterator.Key(), val: bz}) + + } + + err := iterator.Close() + if err != nil { + return errorsmod.Wrap(err, "iterator failed to close during migration") + } + + // Store the updated TickLiquidity + for _, v := range ticksToUpdate { + store.Set(v.key, v.val) + } + + ctx.Logger().Info("Finished migrating TickLiquidity Prices...") + + return nil +} + +func migrateInactiveTranchePrices(ctx sdk.Context, cdc codec.BinaryCodec, storeKey storetypes.StoreKey) error { + // Due to change in precision of PrecDec between v2 and v3 we need to recompute all PrecDecs in the kvstore + ctx.Logger().Info("Migrating InactiveLimitOrderTranche Prices...") + + // Iterate through all InactiveTranches + store := prefix.NewStore(ctx.KVStore(storeKey), types.KeyPrefix(types.InactiveLimitOrderTrancheKeyPrefix)) + iterator := storetypes.KVStorePrefixIterator(store, []byte{}) + ticksToUpdate := make([]migrationUpdate, 0) + + for ; iterator.Valid(); iterator.Next() { + var tranche types.LimitOrderTranche + cdc.MustUnmarshal(iterator.Value(), &tranche) + // Recalculate price + tranche.PriceTakerToMaker = types.MustCalcPrice(tranche.Key.TickIndexTakerToMaker) + + bz := cdc.MustMarshal(&tranche) + ticksToUpdate = append(ticksToUpdate, migrationUpdate{key: iterator.Key(), val: bz}) + } + + err := iterator.Close() + if err != nil { + return errorsmod.Wrap(err, "iterator failed to close during migration") + } + + // Store the updated InactiveTranches + for _, v := range ticksToUpdate { + store.Set(v.key, v.val) + } + + ctx.Logger().Info("Finished migrating InactiveLimitOrderTranche Prices...") + + return nil +} diff --git a/x/dex/migrations/v4/store_test.go b/x/dex/migrations/v4/store_test.go new file mode 100644 index 000000000..10aa1bded --- /dev/null +++ b/x/dex/migrations/v4/store_test.go @@ -0,0 +1,73 @@ +package v4_test + +import ( + "testing" + + "github.com/stretchr/testify/suite" + + "github.com/neutron-org/neutron/v4/testutil" + "github.com/neutron-org/neutron/v4/utils/math" + v4 "github.com/neutron-org/neutron/v4/x/dex/migrations/v4" + "github.com/neutron-org/neutron/v4/x/dex/types" +) + +type V4DexMigrationTestSuite struct { + testutil.IBCConnectionTestSuite +} + +func TestKeeperTestSuite(t *testing.T) { + suite.Run(t, new(V4DexMigrationTestSuite)) +} + +func (suite *V4DexMigrationTestSuite) TestPriceUpdates() { + var ( + app = suite.GetNeutronZoneApp(suite.ChainA) + storeKey = app.GetKey(types.StoreKey) + ctx = suite.ChainA.GetContext() + cdc = app.AppCodec() + ) + + // Write tranche with incorrect price + trancheKey := &types.LimitOrderTrancheKey{ + TradePairId: types.MustNewTradePairID("TokenA", "TokenB"), + TickIndexTakerToMaker: -50, + TrancheKey: "123", + } + tranche := &types.LimitOrderTranche{ + Key: trancheKey, + PriceTakerToMaker: math.ZeroPrecDec(), + } + app.DexKeeper.SetLimitOrderTranche(ctx, tranche) + + // also create inactive tranche + app.DexKeeper.SetInactiveLimitOrderTranche(ctx, tranche) + + // Write poolReserves with incorrect prices + poolKey := &types.PoolReservesKey{ + TradePairId: types.MustNewTradePairID("TokenA", "TokenB"), + TickIndexTakerToMaker: 60000, + Fee: 1, + } + poolReserves := &types.PoolReserves{ + Key: poolKey, + PriceTakerToMaker: math.ZeroPrecDec(), + PriceOppositeTakerToMaker: math.ZeroPrecDec(), + } + app.DexKeeper.SetPoolReserves(ctx, poolReserves) + + // Run migration + suite.NoError(v4.MigrateStore(ctx, cdc, storeKey)) + + // Check LimitOrderTranche has correct price + newTranche := app.DexKeeper.GetLimitOrderTranche(ctx, trancheKey) + suite.True(newTranche.PriceTakerToMaker.Equal(math.MustNewPrecDecFromStr("1.005012269623051203500693815"))) + + // check InactiveLimitOrderTranche has correct price + inactiveTranche, _ := app.DexKeeper.GetInactiveLimitOrderTranche(ctx, trancheKey) + suite.True(inactiveTranche.PriceTakerToMaker.Equal(math.MustNewPrecDecFromStr("1.005012269623051203500693815"))) + + // Check PoolReserves has the correct prices + newPool, _ := app.DexKeeper.GetPoolReserves(ctx, poolKey) + suite.True(newPool.PriceTakerToMaker.Equal(math.MustNewPrecDecFromStr("0.002479495864288162666675923"))) + suite.True(newPool.PriceOppositeTakerToMaker.Equal(math.MustNewPrecDecFromStr("403.227141612124702272520931931"))) +} diff --git a/x/dex/module.go b/x/dex/module.go index 3e1e31136..f2fa6cb52 100644 --- a/x/dex/module.go +++ b/x/dex/module.go @@ -158,6 +158,10 @@ func (am AppModule) RegisterServices(cfg module.Configurator) { if err := cfg.RegisterMigration(types.ModuleName, 2, m.Migrate2to3); err != nil { panic(fmt.Sprintf("failed to migrate x/dex from version 2 to 3: %v", err)) } + + if err := cfg.RegisterMigration(types.ModuleName, 3, m.Migrate3to4); err != nil { + panic(fmt.Sprintf("failed to migrate x/dex from version 3 to 4: %v", err)) + } } // RegisterInvariants registers the capability module's invariants. From c9d55c5dc6c0a1691b0ca8c00ec2baadf655b29b Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Fri, 21 Jun 2024 13:38:14 +0300 Subject: [PATCH 66/87] fix comment --- x/dex/migrations/v4/store.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/dex/migrations/v4/store.go b/x/dex/migrations/v4/store.go index 89766ff25..61dd9a922 100644 --- a/x/dex/migrations/v4/store.go +++ b/x/dex/migrations/v4/store.go @@ -11,7 +11,7 @@ import ( ) // MigrateStore performs in-place store migrations. -// The migration adds new dex params -- GoodTilPurgeAllowance & MaxJITsPerBlock// for handling JIT orders. +// Due to change in precision of PrecDec between v3 and v4 we need to recompute all PrecDecs in the kvstore func MigrateStore(ctx sdk.Context, cdc codec.BinaryCodec, storeKey storetypes.StoreKey) error { if err := migrateTickLiquidityPrices(ctx, cdc, storeKey); err != nil { return err From 762f960dca5fd965099e8104f1a03adcab32eaff Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Fri, 21 Jun 2024 16:40:43 +0300 Subject: [PATCH 67/87] bump slinky to v1.0.3 --- go.mod | 2 +- go.sum | 4 ++-- tests/slinky/go.mod | 6 +++--- tests/slinky/go.sum | 14 +++++++------- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index 62b72efc4..e47c98848 100644 --- a/go.mod +++ b/go.mod @@ -39,7 +39,7 @@ require ( github.com/rs/zerolog v1.32.0 github.com/skip-mev/block-sdk/v2 v2.1.2 github.com/skip-mev/feemarket v1.0.3 - github.com/skip-mev/slinky v1.0.1 + github.com/skip-mev/slinky v1.0.3 github.com/spf13/cast v1.6.0 github.com/spf13/cobra v1.8.1 github.com/spf13/pflag v1.0.5 diff --git a/go.sum b/go.sum index 5c6ab1f1f..7ae72b2af 100644 --- a/go.sum +++ b/go.sum @@ -1091,8 +1091,8 @@ github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610 h1:4JlsiRVt github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610/go.mod h1:kB8gFZX07CyJnw8q9iEZijI3qJTIe1K/Y++P5VGkrcg= github.com/skip-mev/feemarket v1.0.3 h1:DpB1tj51MlFN5iOg1lN+fwWqSF62xdND46BqgTko0C4= github.com/skip-mev/feemarket v1.0.3/go.mod h1:lszt7zGEEActbDYq1hOKogQvfCsnLEHH5113LwgmYcE= -github.com/skip-mev/slinky v1.0.1 h1:z+T6MSZP09boqQnYkat5788iLY4reG37DaFp4J0T8+E= -github.com/skip-mev/slinky v1.0.1/go.mod h1:2MFWaJERFl/oe47ZlO97sTg56M0pvZ9MOckRo2mCwnU= +github.com/skip-mev/slinky v1.0.3 h1:+7Yw+HHjYqJ7gb5nrG1k2bplNG+qEmn5wws+OesdY2M= +github.com/skip-mev/slinky v1.0.3/go.mod h1:EE3O71wIJ74OciYh62Fc5EysF07KArBEYb6lDmTIKVM= 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= diff --git a/tests/slinky/go.mod b/tests/slinky/go.mod index 2415f5b11..5042c0f05 100644 --- a/tests/slinky/go.mod +++ b/tests/slinky/go.mod @@ -14,7 +14,7 @@ replace ( require ( github.com/cosmos/cosmos-sdk v0.50.7 - github.com/skip-mev/slinky v1.0.1-rc + github.com/skip-mev/slinky v1.0.3 github.com/skip-mev/slinky/tests/integration v1.1.1-0.20240614013955-8d008bc600dd github.com/strangelove-ventures/interchaintest/v8 v8.4.0 github.com/stretchr/testify v1.9.0 @@ -127,7 +127,7 @@ require ( github.com/googleapis/gax-go/v2 v2.12.4 // indirect github.com/gorilla/handlers v1.5.2 // indirect github.com/gorilla/mux v1.8.1 // indirect - github.com/gorilla/websocket v1.5.2 // indirect + github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect @@ -210,7 +210,7 @@ require ( github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/spf13/afero v1.11.0 // indirect github.com/spf13/cast v1.6.0 // indirect - github.com/spf13/cobra v1.8.0 // indirect + github.com/spf13/cobra v1.8.1 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/viper v1.19.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect diff --git a/tests/slinky/go.sum b/tests/slinky/go.sum index 75d1acbe6..46887e81a 100644 --- a/tests/slinky/go.sum +++ b/tests/slinky/go.sum @@ -403,7 +403,7 @@ github.com/cosmos/interchain-security/v5 v5.0.0/go.mod h1:h/RkwOppo5AJj+1pkQyfjq github.com/cosmos/ledger-cosmos-go v0.13.3 h1:7ehuBGuyIytsXbd4MP43mLeoN2LTOEnk5nvue4rK+yM= github.com/cosmos/ledger-cosmos-go v0.13.3/go.mod h1:HENcEP+VtahZFw38HZ3+LS3Iv5XV6svsnkk9vdJtLr8= 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.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= 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/danieljoos/wincred v1.2.1 h1:dl9cBrupW8+r5250DYkYxocLeZ1Y4vB1kxgtjxw8GQs= @@ -668,8 +668,8 @@ github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= 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.5.2 h1:qoW6V1GT3aZxybsbC6oLnailWnB+qTMVwMreOso9XUw= -github.com/gorilla/websocket v1.5.2/go.mod h1:0n9H61RBAcf5/38py2MCYbxzPIY9rOkpvvMT24Rqs30= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= 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.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= @@ -1044,8 +1044,8 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/skip-mev/chaintestutil v0.0.0-20240116134208-3e49bf514803 h1:VRRVYN3wsOIOqVT3e3nDh3vyUl6RvF9QwdK4BvgPP9c= github.com/skip-mev/chaintestutil v0.0.0-20240116134208-3e49bf514803/go.mod h1:LF2koCTmygQnz11yjSfHvNP8axdyZ2lTEw0EwI+dnno= -github.com/skip-mev/slinky v1.0.1-rc h1:DB2gwc20AbfcnZhfhHg7cT2rsc8FhkUbvC6NVmWt7oQ= -github.com/skip-mev/slinky v1.0.1-rc/go.mod h1:DvvvuNshfoEjDRMs6qgbSJu/cV+g1I9z7lAXzt77WHE= +github.com/skip-mev/slinky v1.0.3 h1:+7Yw+HHjYqJ7gb5nrG1k2bplNG+qEmn5wws+OesdY2M= +github.com/skip-mev/slinky v1.0.3/go.mod h1:EE3O71wIJ74OciYh62Fc5EysF07KArBEYb6lDmTIKVM= github.com/skip-mev/slinky/tests/integration v1.1.1-0.20240614013955-8d008bc600dd h1:jqem8fOGfvzykGaAMe8daZh+SU+5GMBNaJJXOHpx/Wc= github.com/skip-mev/slinky/tests/integration v1.1.1-0.20240614013955-8d008bc600dd/go.mod h1:N78g29Sbbr8MdUm/wVx0B9kALvDLaF9Bn2fYIAUL7sI= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= @@ -1062,8 +1062,8 @@ github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNo github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/pflag v1.0.1/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= From daf306ddee9402879acad215dd2e5f2d99f49c8f Mon Sep 17 00:00:00 2001 From: Julian Compagni Portis Date: Fri, 21 Jun 2024 10:35:56 -0400 Subject: [PATCH 68/87] make errors clearer --- x/tokenfactory/keeper/before_send.go | 2 +- x/tokenfactory/migrations/v2/store.go | 5 +++-- x/tokenfactory/types/params.go | 6 +++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/x/tokenfactory/keeper/before_send.go b/x/tokenfactory/keeper/before_send.go index cf471a497..547222124 100644 --- a/x/tokenfactory/keeper/before_send.go +++ b/x/tokenfactory/keeper/before_send.go @@ -128,7 +128,7 @@ func (k Keeper) callBeforeSendListener(ctx context.Context, from, to sdk.AccAddr c.Logger().Error( "Skipped hook execution due to missing whitelist", "err", err, - "denom", coin.Amount, + "denom", coin.Denom, "contract", cwAddr.String(), ) continue diff --git a/x/tokenfactory/migrations/v2/store.go b/x/tokenfactory/migrations/v2/store.go index 96a69f144..17a71f793 100644 --- a/x/tokenfactory/migrations/v2/store.go +++ b/x/tokenfactory/migrations/v2/store.go @@ -2,6 +2,7 @@ package v2 import ( "errors" + "fmt" "strings" "cosmossdk.io/store/prefix" @@ -94,7 +95,7 @@ func migrateHooks(ctx sdk.Context, storeKey storetypes.StoreKey, keeper TokenFac for ; iterator.Valid(); iterator.Next() { keyParts := strings.Split(string(iterator.Key()), types.KeySeparator) if len(keyParts) != 3 { - return errors.New("cannot parse BeforeSendHook data") + return fmt.Errorf("cannot parse BeforeSendHook data key: %s", string(iterator.Key())) } // Hooks and authorityMetadata are in the same store, we only care about the hooks @@ -102,7 +103,7 @@ func migrateHooks(ctx sdk.Context, storeKey storetypes.StoreKey, keeper TokenFac denom := keyParts[1] contractAddr, err := sdk.AccAddressFromBech32(string(iterator.Value())) if err != nil { - return errors.New("cannot parse hook contract address") + return fmt.Errorf("cannot parse hook contract address: %s", string(iterator.Value())) } err = keeper.AssertIsHookWhitelisted(ctx, denom, contractAddr) diff --git a/x/tokenfactory/types/params.go b/x/tokenfactory/types/params.go index 8dcd4a029..10328c10e 100644 --- a/x/tokenfactory/types/params.go +++ b/x/tokenfactory/types/params.go @@ -50,15 +50,15 @@ func (p Params) Validate() error { } if err := validateDenomCreationFee(p.DenomCreationFee); err != nil { - return fmt.Errorf("failed to validate params: %w", err) + return fmt.Errorf("failed to validate DenomCreationFee: %w", err) } if err := validateFeeCollectorAddress(p.FeeCollectorAddress); err != nil { - return fmt.Errorf("failed to validate params: %w", err) + return fmt.Errorf("failed to validate FeeCollectorAddress: %w", err) } if err := validateWhitelistedHooks(p.WhitelistedHooks); err != nil { - return fmt.Errorf("failed to validate params: %w", err) + return fmt.Errorf("failed to validate WhitelistedHooks: %w", err) } return nil From 9077e4919679e2818c7ff9f45f76d6172ac461d6 Mon Sep 17 00:00:00 2001 From: Julian Compagni Portis Date: Fri, 21 Jun 2024 11:50:12 -0400 Subject: [PATCH 69/87] fixes to tokenfactory query cli 1. Add missing GetCmdBeforeSendHook query 2. Correctly parse denoms with slashes in subdenom 3. fix typo hiik => hook --- x/tokenfactory/client/cli/query.go | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/x/tokenfactory/client/cli/query.go b/x/tokenfactory/client/cli/query.go index 83dbc0f30..5b62e060a 100644 --- a/x/tokenfactory/client/cli/query.go +++ b/x/tokenfactory/client/cli/query.go @@ -27,6 +27,7 @@ func GetQueryCmd() *cobra.Command { GetParams(), GetCmdDenomAuthorityMetadata(), GetCmdDenomsFromCreator(), + GetCmdBeforeSendHook(), ) return cmd @@ -124,10 +125,10 @@ func GetCmdDenomsFromCreator() *cobra.Command { return cmd } -// GetCmdDenomAuthorityMetadata returns the authority metadata for a queried denom +// GetCmdBeforeSendHook returns the BeforeSendHook for a queried denom func GetCmdBeforeSendHook() *cobra.Command { cmd := &cobra.Command{ - Use: "before-send-hiik [denom] [flags]", + Use: "before-send-hook [denom] [flags]", Short: "Get the before send hook for a specific denom", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { @@ -137,15 +138,15 @@ func GetCmdBeforeSendHook() *cobra.Command { } queryClient := types.NewQueryClient(clientCtx) - denom := strings.Split(args[0], "/") - - if len(denom) != 3 { - return fmt.Errorf("invalid denom format, expected format: factory/[creator]/[subdenom]") + denom := args[0] + creator, subdenom, err := types.DeconstructDenom(denom) + if err != nil { + return err } res, err := queryClient.BeforeSendHookAddress(cmd.Context(), &types.QueryBeforeSendHookAddressRequest{ - Creator: denom[1], - Subdenom: denom[2], + Creator: creator, + Subdenom: subdenom, }) if err != nil { return err From 32bf31b283e1cfd3a9c9d6eaedd9913838754982 Mon Sep 17 00:00:00 2001 From: Julian Compagni Portis Date: Fri, 21 Jun 2024 11:55:22 -0400 Subject: [PATCH 70/87] update code_ids for astroport contract whitelisting --- x/tokenfactory/migrations/v2/store.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x/tokenfactory/migrations/v2/store.go b/x/tokenfactory/migrations/v2/store.go index 17a71f793..e36561925 100644 --- a/x/tokenfactory/migrations/v2/store.go +++ b/x/tokenfactory/migrations/v2/store.go @@ -40,11 +40,11 @@ var WhitelistedHooks = []*types.WhitelistedHook{ DenomCreator: "neutron1zlf3hutsa4qnmue53lz2tfxrutp8y2e3rj4nkghg3rupgl4mqy8s5jgxsn", }, { // USDC <> NTRN balances tracker - CodeID: 944, + CodeID: 1473, DenomCreator: "neutron18c8qejysp4hgcfuxdpj4wf29mevzwllz5yh8uayjxamwtrs0n9fshq9vtv", }, { // NTRN <> ATOM balances tracker - CodeID: 944, + CodeID: 1473, DenomCreator: "neutron145z3nj7yqft2vpugr5a5p7jsnagvms90tvtej45g4s0xkqalhy7sj20vgz", }, { // NFA.zoneV1 From 3e26ebbb8f3aed251af2828aca9d29666feb8622 Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Fri, 21 Jun 2024 19:44:00 +0300 Subject: [PATCH 71/87] do not use a separate event manager for sudo calls in tokenfactory --- x/tokenfactory/keeper/before_send.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/x/tokenfactory/keeper/before_send.go b/x/tokenfactory/keeper/before_send.go index 547222124..40e81ba8b 100644 --- a/x/tokenfactory/keeper/before_send.go +++ b/x/tokenfactory/keeper/before_send.go @@ -162,17 +162,16 @@ func (k Keeper) callBeforeSendListener(ctx context.Context, from, to sdk.AccAddr if err != nil { return err } - em := sdk.NewEventManager() // if its track before send, apply gas meter to prevent infinite loop if blockBeforeSend { - _, err = k.contractKeeper.Sudo(c.WithEventManager(em), cwAddr, msgBz) + _, err = k.contractKeeper.Sudo(c, cwAddr, msgBz) if err != nil { return errorsmod.Wrapf(err, "failed to call before send hook for denom %s", coin.Denom) } } else { childCtx := c.WithGasMeter(types2.NewGasMeter(types.TrackBeforeSendGasLimit)) - _, err = k.contractKeeper.Sudo(childCtx.WithEventManager(em), cwAddr, msgBz) + _, err = k.contractKeeper.Sudo(childCtx, cwAddr, msgBz) if err != nil { return errorsmod.Wrapf(err, "failed to call before send hook for denom %s", coin.Denom) } From e5919009881953ad492e64284cae135d10222d73 Mon Sep 17 00:00:00 2001 From: swelf Date: Mon, 24 Jun 2024 14:51:11 +0300 Subject: [PATCH 72/87] updated prices --- app/upgrades/v4.0.0/upgrades.go | 84 ++++++++++++++++----------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/app/upgrades/v4.0.0/upgrades.go b/app/upgrades/v4.0.0/upgrades.go index 613ce7213..71a9ff717 100644 --- a/app/upgrades/v4.0.0/upgrades.go +++ b/app/upgrades/v4.0.0/upgrades.go @@ -94,68 +94,68 @@ func setMarketMapParams(ctx sdk.Context, marketmapKeeper *marketmapkeeper.Keeper // NtrnPrices describes prices of any token in NTRN for dynamic fee resolver var NtrnPrices = sdk.NewDecCoins( // Token,Denom,TWAP30D (USD),Price in NTRN (30d TWAP of DENOM / 30d TWAP of NTRN),Price + 30% premium - // wstETH,factory/neutron1ug740qrkquxzrk2hh29qrlx3sktkfml3je7juusc2te7xmvsscns0n2wry/wstETH,3392.58,4772.232381488255,5790.006381488255 - sdk.NewDecCoinFromDec("factory/neutron1ug740qrkquxzrk2hh29qrlx3sktkfml3je7juusc2te7xmvsscns0n2wry/wstETH", math.LegacyMustNewDecFromStr("5790.006381488255")), + // wstETH,factory/neutron1ug740qrkquxzrk2hh29qrlx3sktkfml3je7juusc2te7xmvsscns0n2wry/wstETH,3616.34,5779.670768739013,7513.571999360713 + sdk.NewDecCoinFromDec("factory/neutron1ug740qrkquxzrk2hh29qrlx3sktkfml3je7juusc2te7xmvsscns0n2wry/wstETH", math.LegacyMustNewDecFromStr("7513.571999360713")), - // stATOM,ibc/B7864B03E1B9FD4F049243E92ABD691586F682137037A9F3FCA5222815620B3C,8.559,12.039668026445,14.607368026445 - sdk.NewDecCoinFromDec("ibc/B7864B03E1B9FD4F049243E92ABD691586F682137037A9F3FCA5222815620B3C", math.LegacyMustNewDecFromStr("14.607368026445")), + // stATOM,ibc/B7864B03E1B9FD4F049243E92ABD691586F682137037A9F3FCA5222815620B3C,10.268,16.410420329231,21.333546427991 + sdk.NewDecCoinFromDec("ibc/B7864B03E1B9FD4F049243E92ABD691586F682137037A9F3FCA5222815620B3C", math.LegacyMustNewDecFromStr("21.333546427991")), - // stTIA,ibc/6569E05DEE32B339D9286A52BE33DFCEFC97267F23EF9CFDE0C055140967A9A5,9.99,14.052609368406,17.049609368406 - sdk.NewDecCoinFromDec("ibc/6569E05DEE32B339D9286A52BE33DFCEFC97267F23EF9CFDE0C055140967A9A5", math.LegacyMustNewDecFromStr("17.049609368406")), + // stTIA,ibc/6569E05DEE32B339D9286A52BE33DFCEFC97267F23EF9CFDE0C055140967A9A5,8.52,13.61674924085,17.70177401312 + sdk.NewDecCoinFromDec("ibc/6569E05DEE32B339D9286A52BE33DFCEFC97267F23EF9CFDE0C055140967A9A5", math.LegacyMustNewDecFromStr("17.70177401312")), - // stkATOM,ibc/3649CE0C8A2C79048D8C6F31FF18FA69C9BC7EB193512E0BD03B733011290445,8.559,12.039668026445,14.607368026445 - sdk.NewDecCoinFromDec("ibc/3649CE0C8A2C79048D8C6F31FF18FA69C9BC7EB193512E0BD03B733011290445", math.LegacyMustNewDecFromStr("14.607368026445")), + // stkATOM,ibc/3649CE0C8A2C79048D8C6F31FF18FA69C9BC7EB193512E0BD03B733011290445,9.656,15.432315806297,20.062010548187 + sdk.NewDecCoinFromDec("ibc/3649CE0C8A2C79048D8C6F31FF18FA69C9BC7EB193512E0BD03B733011290445", math.LegacyMustNewDecFromStr("20.062010548187")), - // USDC.noble,ibc/B559A80D62249C8AA07A380E2A2BEA6E5CA9A6F079C912C3A9E9B494105E4F81,1,1.406667604445,1.706667604445 - sdk.NewDecCoinFromDec("ibc/B559A80D62249C8AA07A380E2A2BEA6E5CA9A6F079C912C3A9E9B494105E4F81", math.LegacyMustNewDecFromStr("1.706667604445")), + // USDC.noble,ibc/B559A80D62249C8AA07A380E2A2BEA6E5CA9A6F079C912C3A9E9B494105E4F81,1,1.598210004795,2.077673006235 + sdk.NewDecCoinFromDec("ibc/B559A80D62249C8AA07A380E2A2BEA6E5CA9A6F079C912C3A9E9B494105E4F81", math.LegacyMustNewDecFromStr("2.077673006235")), - // USDC.axl,ibc/F082B65C88E4B6D5EF1DB243CDA1D331D002759E938A0F5CD3FFDC5D53B3E349,1,1.406667604445,1.706667604445 - sdk.NewDecCoinFromDec("ibc/F082B65C88E4B6D5EF1DB243CDA1D331D002759E938A0F5CD3FFDC5D53B3E349", math.LegacyMustNewDecFromStr("1.706667604445")), + // USDC.axl,ibc/F082B65C88E4B6D5EF1DB243CDA1D331D002759E938A0F5CD3FFDC5D53B3E349,1,1.598210004795,2.077673006235 + sdk.NewDecCoinFromDec("ibc/F082B65C88E4B6D5EF1DB243CDA1D331D002759E938A0F5CD3FFDC5D53B3E349", math.LegacyMustNewDecFromStr("2.077673006235")), - // USDT,ibc/57503D7852EF4E1899FE6D71C5E81D7C839F76580F86F21E39348FC2BC9D7CE2,1,1.406667604445,1.706667604445 - sdk.NewDecCoinFromDec("ibc/57503D7852EF4E1899FE6D71C5E81D7C839F76580F86F21E39348FC2BC9D7CE2", math.LegacyMustNewDecFromStr("1.706667604445")), + // USDT,ibc/57503D7852EF4E1899FE6D71C5E81D7C839F76580F86F21E39348FC2BC9D7CE2,1,1.598210004795,2.077673006235 + sdk.NewDecCoinFromDec("ibc/57503D7852EF4E1899FE6D71C5E81D7C839F76580F86F21E39348FC2BC9D7CE2", math.LegacyMustNewDecFromStr("2.077673006235")), - // http://astro.cw/,ibc/5751B8BCDA688FD0A8EC0B292EEF1CDEAB4B766B63EC632778B196D317C40C3A,0.0020456,0.002877479252,0.003491159252 - sdk.NewDecCoinFromDec("ibc/5751B8BCDA688FD0A8EC0B292EEF1CDEAB4B766B63EC632778B196D317C40C3A", math.LegacyMustNewDecFromStr("0.003491159252")), + // http://astro.cw/,ibc/5751B8BCDA688FD0A8EC0B292EEF1CDEAB4B766B63EC632778B196D317C40C3A,0.0693,0.110755953332,0.143982739322 + sdk.NewDecCoinFromDec("ibc/5751B8BCDA688FD0A8EC0B292EEF1CDEAB4B766B63EC632778B196D317C40C3A", math.LegacyMustNewDecFromStr("0.143982739322")), - // ASTRO,factory/neutron1ffus553eet978k024lmssw0czsxwr97mggyv85lpcsdkft8v9ufsz3sa07/astro,0.0020456,0.002877479252,0.003491159252 - sdk.NewDecCoinFromDec("factory/neutron1ffus553eet978k024lmssw0czsxwr97mggyv85lpcsdkft8v9ufsz3sa07/astro", math.LegacyMustNewDecFromStr("0.003491159252")), + // ASTRO,factory/neutron1ffus553eet978k024lmssw0czsxwr97mggyv85lpcsdkft8v9ufsz3sa07/astro,0.0693,0.110755953332,0.143982739322 + sdk.NewDecCoinFromDec("factory/neutron1ffus553eet978k024lmssw0czsxwr97mggyv85lpcsdkft8v9ufsz3sa07/astro", math.LegacyMustNewDecFromStr("0.143982739322")), - // MARS,ibc/9598CDEB7C6DB7FC21E746C8E0250B30CD5154F39CA111A9D4948A4362F638BD,0.086318,0.12142073428,0.14731613428 - sdk.NewDecCoinFromDec("ibc/9598CDEB7C6DB7FC21E746C8E0250B30CD5154F39CA111A9D4948A4362F638BD", math.LegacyMustNewDecFromStr("0.14731613428")), + // MARS,ibc/9598CDEB7C6DB7FC21E746C8E0250B30CD5154F39CA111A9D4948A4362F638BD,0.0652,0.104203292313,0.135464280003 + sdk.NewDecCoinFromDec("ibc/9598CDEB7C6DB7FC21E746C8E0250B30CD5154F39CA111A9D4948A4362F638BD", math.LegacyMustNewDecFromStr("0.135464280003")), - // APOLLO,factory/neutron154gg0wtm2v4h9ur8xg32ep64e8ef0g5twlsgvfeajqwghdryvyqsqhgk8e/APOLLO,0.1824,0.256576171051,0.311296171051 - sdk.NewDecCoinFromDec("factory/neutron154gg0wtm2v4h9ur8xg32ep64e8ef0g5twlsgvfeajqwghdryvyqsqhgk8e/APOLLO", math.LegacyMustNewDecFromStr("0.311296171051")), + // APOLLO,factory/neutron154gg0wtm2v4h9ur8xg32ep64e8ef0g5twlsgvfeajqwghdryvyqsqhgk8e/APOLLO,0.06079,0.097155186191,0.126301742051 + sdk.NewDecCoinFromDec("factory/neutron154gg0wtm2v4h9ur8xg32ep64e8ef0g5twlsgvfeajqwghdryvyqsqhgk8e/APOLLO", math.LegacyMustNewDecFromStr("0.126301742051")), - // TIA,ibc/773B4D0A3CD667B2275D5A4A7A2F0909C0BA0F4059C0B9181E680DDF4965DCC7,9.99,14.052609368406,17.049609368406 - sdk.NewDecCoinFromDec("ibc/773B4D0A3CD667B2275D5A4A7A2F0909C0BA0F4059C0B9181E680DDF4965DCC7", math.LegacyMustNewDecFromStr("17.049609368406")), + // TIA,ibc/773B4D0A3CD667B2275D5A4A7A2F0909C0BA0F4059C0B9181E680DDF4965DCC7,8.52,13.61674924085,17.70177401312 + sdk.NewDecCoinFromDec("ibc/773B4D0A3CD667B2275D5A4A7A2F0909C0BA0F4059C0B9181E680DDF4965DCC7", math.LegacyMustNewDecFromStr("17.70177401312")), - // ATOM,ibc/C4CFF46FD6DE35CA4CF4CE031E643C8FDC9BA4B99AE598E9B0ED98FE3A2319F9,8.559,12.039668026445,14.607368026445 - sdk.NewDecCoinFromDec("ibc/C4CFF46FD6DE35CA4CF4CE031E643C8FDC9BA4B99AE598E9B0ED98FE3A2319F9", math.LegacyMustNewDecFromStr("14.607368026445")), + // ATOM,ibc/C4CFF46FD6DE35CA4CF4CE031E643C8FDC9BA4B99AE598E9B0ED98FE3A2319F9,7.559,12.080869426243,15.705130254103 + sdk.NewDecCoinFromDec("ibc/C4CFF46FD6DE35CA4CF4CE031E643C8FDC9BA4B99AE598E9B0ED98FE3A2319F9", math.LegacyMustNewDecFromStr("15.705130254103")), - // axlWETH,ibc/A585C2D15DCD3B010849B453A2CFCB5E213208A5AB665691792684C26274304D,3392.58,4772.232381488255,5790.006381488255 - sdk.NewDecCoinFromDec("ibc/A585C2D15DCD3B010849B453A2CFCB5E213208A5AB665691792684C26274304D", math.LegacyMustNewDecFromStr("5790.006381488255")), + // axlWETH,ibc/A585C2D15DCD3B010849B453A2CFCB5E213208A5AB665691792684C26274304D,3616.34,5779.670768739013,7513.571999360713 + sdk.NewDecCoinFromDec("ibc/A585C2D15DCD3B010849B453A2CFCB5E213208A5AB665691792684C26274304D", math.LegacyMustNewDecFromStr("7513.571999360713")), - // OSMO,ibc/376222D6D9DAE23092E29740E56B758580935A6D77C24C2ABD57A6A78A1F3955,0.8784,1.235616823745,1.499136823745 - sdk.NewDecCoinFromDec("ibc/376222D6D9DAE23092E29740E56B758580935A6D77C24C2ABD57A6A78A1F3955", math.LegacyMustNewDecFromStr("1.499136823745")), + // OSMO,ibc/376222D6D9DAE23092E29740E56B758580935A6D77C24C2ABD57A6A78A1F3955,0.6699,1.070640882212,1.391833146872 + sdk.NewDecCoinFromDec("ibc/376222D6D9DAE23092E29740E56B758580935A6D77C24C2ABD57A6A78A1F3955", math.LegacyMustNewDecFromStr("1.391833146872")), - // DYM,ibc/4A6A46D4263F2ED3DCE9CF866FE15E6903FB5E12D87EB8BDC1B6B1A1E2D397B4,3.043,4.280489520326,5.193389520326 - sdk.NewDecCoinFromDec("ibc/4A6A46D4263F2ED3DCE9CF866FE15E6903FB5E12D87EB8BDC1B6B1A1E2D397B4", math.LegacyMustNewDecFromStr("5.193389520326")), + // DYM,ibc/4A6A46D4263F2ED3DCE9CF866FE15E6903FB5E12D87EB8BDC1B6B1A1E2D397B4,2.329,3.722231101167,4.838900431527 + sdk.NewDecCoinFromDec("ibc/4A6A46D4263F2ED3DCE9CF866FE15E6903FB5E12D87EB8BDC1B6B1A1E2D397B4", math.LegacyMustNewDecFromStr("4.838900431527")), - // DYDX,ibc/2CB87BCE0937B1D1DFCEE79BE4501AAF3C265E923509AEAC410AD85D27F35130,2.036,2.86397524265,3.47477524265 - sdk.NewDecCoinFromDec("ibc/2CB87BCE0937B1D1DFCEE79BE4501AAF3C265E923509AEAC410AD85D27F35130", math.LegacyMustNewDecFromStr("3.47477524265")), + // DYDX,ibc/2CB87BCE0937B1D1DFCEE79BE4501AAF3C265E923509AEAC410AD85D27F35130,1.71,2.732939108199,3.552820840659 + sdk.NewDecCoinFromDec("ibc/2CB87BCE0937B1D1DFCEE79BE4501AAF3C265E923509AEAC410AD85D27F35130", math.LegacyMustNewDecFromStr("3.552820840659")), - // KUJI,ibc/1053E271314D36FECBC915B51474F8B3962597CE88FF3E4A74795B0E3F367A8B,1.49,2.095934730623,2.542934730623 - sdk.NewDecCoinFromDec("ibc/1053E271314D36FECBC915B51474F8B3962597CE88FF3E4A74795B0E3F367A8B", math.LegacyMustNewDecFromStr("2.542934730623")), + // KUJI,ibc/1053E271314D36FECBC915B51474F8B3962597CE88FF3E4A74795B0E3F367A8B,1.22,1.949816205849,2.534761067589 + sdk.NewDecCoinFromDec("ibc/1053E271314D36FECBC915B51474F8B3962597CE88FF3E4A74795B0E3F367A8B", math.LegacyMustNewDecFromStr("2.534761067589")), - // STARS,ibc/A139C0E0B5E87CBA8EAEEB12B9BEE13AC7C814CFBBFA87BBCADD67E31003466C,0.017794524,0.025030980447,0.030369337647 - sdk.NewDecCoinFromDec("ibc/A139C0E0B5E87CBA8EAEEB12B9BEE13AC7C814CFBBFA87BBCADD67E31003466C", math.LegacyMustNewDecFromStr("0.030369337647")), + // STARS,ibc/A139C0E0B5E87CBA8EAEEB12B9BEE13AC7C814CFBBFA87BBCADD67E31003466C,0.0138,0.022055298066,0.028671887496 + sdk.NewDecCoinFromDec("ibc/A139C0E0B5E87CBA8EAEEB12B9BEE13AC7C814CFBBFA87BBCADD67E31003466C", math.LegacyMustNewDecFromStr("0.028671887496")), - // AXL,ibc/C0E66D1C81D8AAF0E6896E05190FDFBC222367148F86AC3EA679C28327A763CD,1.0637,1.496272330848,1.815382330848 - sdk.NewDecCoinFromDec("ibc/C0E66D1C81D8AAF0E6896E05190FDFBC222367148F86AC3EA679C28327A763CD", math.LegacyMustNewDecFromStr("1.815382330848")), + // AXL,ibc/C0E66D1C81D8AAF0E6896E05190FDFBC222367148F86AC3EA679C28327A763CD,0.802,1.281764423845,1.666293750985 + sdk.NewDecCoinFromDec("ibc/C0E66D1C81D8AAF0E6896E05190FDFBC222367148F86AC3EA679C28327A763CD", math.LegacyMustNewDecFromStr("1.666293750985")), - // STRD,ibc/3552CECB7BCE1891DB6070D37EC6E954C972B1400141308FCD85FD148BD06DE5,1.713582985,2.410441672528,2.924516568028 - sdk.NewDecCoinFromDec("ibc/3552CECB7BCE1891DB6070D37EC6E954C972B1400141308FCD85FD148BD06DE5", math.LegacyMustNewDecFromStr("2.924516568028")), + // STRD,ibc/3552CECB7BCE1891DB6070D37EC6E954C972B1400141308FCD85FD148BD06DE5,1.542,2.464439827393,3.203771775613 + sdk.NewDecCoinFromDec("ibc/3552CECB7BCE1891DB6070D37EC6E954C972B1400141308FCD85FD148BD06DE5", math.LegacyMustNewDecFromStr("3.203771775613")), ) func setDynamicFeesParams(ctx sdk.Context, dfKeeper *dynamicfeeskeeper.Keeper) error { From ec9ddee26c9a93d8e35d34fa6535a4653c5dd922 Mon Sep 17 00:00:00 2001 From: swelf Date: Mon, 24 Jun 2024 15:16:12 +0300 Subject: [PATCH 73/87] changed upgrade name, skipped modules configuration for pion-1 --- app/app.go | 4 +- app/upgrades/{v4.0.0 => v4.0.1}/constants.go | 2 +- app/upgrades/{v4.0.0 => v4.0.1}/upgrades.go | 58 ++++++++++--------- .../{v4.0.0 => v4.0.1}/upgrades_test.go | 2 +- 4 files changed, 35 insertions(+), 31 deletions(-) rename app/upgrades/{v4.0.0 => v4.0.1}/constants.go (97%) rename app/upgrades/{v4.0.0 => v4.0.1}/upgrades.go (92%) rename app/upgrades/{v4.0.0 => v4.0.1}/upgrades_test.go (98%) diff --git a/app/app.go b/app/app.go index 8091d9426..6b0734a28 100644 --- a/app/app.go +++ b/app/app.go @@ -36,7 +36,7 @@ import ( oracleclient "github.com/skip-mev/slinky/service/clients/oracle" servicemetrics "github.com/skip-mev/slinky/service/metrics" - v400 "github.com/neutron-org/neutron/v4/app/upgrades/v4.0.0" + v401 "github.com/neutron-org/neutron/v4/app/upgrades/v4.0.1" "github.com/neutron-org/neutron/v4/x/globalfee" globalfeetypes "github.com/neutron-org/neutron/v4/x/globalfee/types" @@ -225,7 +225,7 @@ const ( ) var ( - Upgrades = []upgrades.Upgrade{v400.Upgrade} + Upgrades = []upgrades.Upgrade{v401.Upgrade} // DefaultNodeHome default home directories for the application daemon DefaultNodeHome string diff --git a/app/upgrades/v4.0.0/constants.go b/app/upgrades/v4.0.1/constants.go similarity index 97% rename from app/upgrades/v4.0.0/constants.go rename to app/upgrades/v4.0.1/constants.go index 2d03c5d38..1b7b6c86d 100644 --- a/app/upgrades/v4.0.0/constants.go +++ b/app/upgrades/v4.0.1/constants.go @@ -14,7 +14,7 @@ import ( const ( // UpgradeName defines the on-chain upgrade name. - UpgradeName = "v4.0.0" + UpgradeName = "v4.0.1" // MarketMapAuthorityMultisig defines the address of a market-map authority governed by a // multi-sig of contributors. diff --git a/app/upgrades/v4.0.0/upgrades.go b/app/upgrades/v4.0.1/upgrades.go similarity index 92% rename from app/upgrades/v4.0.0/upgrades.go rename to app/upgrades/v4.0.1/upgrades.go index 71a9ff717..d0d14db2f 100644 --- a/app/upgrades/v4.0.0/upgrades.go +++ b/app/upgrades/v4.0.1/upgrades.go @@ -49,33 +49,37 @@ func CreateUpgradeHandler( return vm, err } - ctx.Logger().Info("Setting consensus params...") - err = enableVoteExtensions(ctx, keepers.ConsensusKeeper) - if err != nil { - return nil, err - } - - ctx.Logger().Info("Setting marketmap params...") - err = setMarketMapParams(ctx, keepers.MarketmapKeeper) - if err != nil { - return nil, err - } - - ctx.Logger().Info("Setting dynamicfees/feemarket params...") - err = setFeeMarketParams(ctx, keepers.FeeMarketKeeper) - if err != nil { - return nil, err - } - - err = setDynamicFeesParams(ctx, keepers.DynamicfeesKeeper) - if err != nil { - return nil, err - } - - ctx.Logger().Info("Setting marketmap and oracle state...") - err = setMarketState(ctx, keepers.MarketmapKeeper) - if err != nil { - return nil, err + if ctx.ChainID() != "pion-1" { + // skip the migration set since + // the following changes already were applied on `pion-1` chain during `v4.0.1` release + ctx.Logger().Info("Setting consensus params...") + err = enableVoteExtensions(ctx, keepers.ConsensusKeeper) + if err != nil { + return nil, err + } + + ctx.Logger().Info("Setting marketmap params...") + err = setMarketMapParams(ctx, keepers.MarketmapKeeper) + if err != nil { + return nil, err + } + + ctx.Logger().Info("Setting dynamicfees/feemarket params...") + err = setFeeMarketParams(ctx, keepers.FeeMarketKeeper) + if err != nil { + return nil, err + } + + err = setDynamicFeesParams(ctx, keepers.DynamicfeesKeeper) + if err != nil { + return nil, err + } + + ctx.Logger().Info("Setting marketmap and oracle state...") + err = setMarketState(ctx, keepers.MarketmapKeeper) + if err != nil { + return nil, err + } } ctx.Logger().Info(fmt.Sprintf("Migration {%s} applied", UpgradeName)) diff --git a/app/upgrades/v4.0.0/upgrades_test.go b/app/upgrades/v4.0.1/upgrades_test.go similarity index 98% rename from app/upgrades/v4.0.0/upgrades_test.go rename to app/upgrades/v4.0.1/upgrades_test.go index e38f91b9c..987cf20bb 100644 --- a/app/upgrades/v4.0.0/upgrades_test.go +++ b/app/upgrades/v4.0.1/upgrades_test.go @@ -16,7 +16,7 @@ import ( "github.com/stretchr/testify/suite" - v400 "github.com/neutron-org/neutron/v4/app/upgrades/v4.0.0" + v400 "github.com/neutron-org/neutron/v4/app/upgrades/v4.0.1" "github.com/neutron-org/neutron/v4/testutil" ) From 3727bb8482b3078f0d979ada963013a7e8762d31 Mon Sep 17 00:00:00 2001 From: swelf Date: Mon, 24 Jun 2024 19:39:18 +0300 Subject: [PATCH 74/87] 18 -> 6 decimals adjustment --- app/upgrades/v4.0.1/constants.go | 2 ++ app/upgrades/v4.0.1/upgrades.go | 14 ++++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/app/upgrades/v4.0.1/constants.go b/app/upgrades/v4.0.1/constants.go index 1b7b6c86d..6e78acb3b 100644 --- a/app/upgrades/v4.0.1/constants.go +++ b/app/upgrades/v4.0.1/constants.go @@ -19,6 +19,8 @@ const ( // MarketMapAuthorityMultisig defines the address of a market-map authority governed by a // multi-sig of contributors. MarketMapAuthorityMultisig = "neutron1ua63s43u2p4v38pxhcxmps0tj2gudyw2hfeetz" + + DecimalsAdjustment = 1_000_000_000_000 ) var Upgrade = upgrades.Upgrade{ diff --git a/app/upgrades/v4.0.1/upgrades.go b/app/upgrades/v4.0.1/upgrades.go index d0d14db2f..098771fdb 100644 --- a/app/upgrades/v4.0.1/upgrades.go +++ b/app/upgrades/v4.0.1/upgrades.go @@ -96,10 +96,13 @@ func setMarketMapParams(ctx sdk.Context, marketmapKeeper *marketmapkeeper.Keeper } // NtrnPrices describes prices of any token in NTRN for dynamic fee resolver +// there are several 18decimals coins, we nned to adjust all the coins with the same base (6 decimals) prior to do any math +// by dividing by 10^12 var NtrnPrices = sdk.NewDecCoins( // Token,Denom,TWAP30D (USD),Price in NTRN (30d TWAP of DENOM / 30d TWAP of NTRN),Price + 30% premium // wstETH,factory/neutron1ug740qrkquxzrk2hh29qrlx3sktkfml3je7juusc2te7xmvsscns0n2wry/wstETH,3616.34,5779.670768739013,7513.571999360713 - sdk.NewDecCoinFromDec("factory/neutron1ug740qrkquxzrk2hh29qrlx3sktkfml3je7juusc2te7xmvsscns0n2wry/wstETH", math.LegacyMustNewDecFromStr("7513.571999360713")), + // 18 decimals coin + sdk.NewDecCoinFromDec("factory/neutron1ug740qrkquxzrk2hh29qrlx3sktkfml3je7juusc2te7xmvsscns0n2wry/wstETH", math.LegacyMustNewDecFromStr("7513.571999360713").QuoInt64(DecimalsAdjustment)), // stATOM,ibc/B7864B03E1B9FD4F049243E92ABD691586F682137037A9F3FCA5222815620B3C,10.268,16.410420329231,21.333546427991 sdk.NewDecCoinFromDec("ibc/B7864B03E1B9FD4F049243E92ABD691586F682137037A9F3FCA5222815620B3C", math.LegacyMustNewDecFromStr("21.333546427991")), @@ -138,16 +141,19 @@ var NtrnPrices = sdk.NewDecCoins( sdk.NewDecCoinFromDec("ibc/C4CFF46FD6DE35CA4CF4CE031E643C8FDC9BA4B99AE598E9B0ED98FE3A2319F9", math.LegacyMustNewDecFromStr("15.705130254103")), // axlWETH,ibc/A585C2D15DCD3B010849B453A2CFCB5E213208A5AB665691792684C26274304D,3616.34,5779.670768739013,7513.571999360713 - sdk.NewDecCoinFromDec("ibc/A585C2D15DCD3B010849B453A2CFCB5E213208A5AB665691792684C26274304D", math.LegacyMustNewDecFromStr("7513.571999360713")), + // 18 decimals coin + sdk.NewDecCoinFromDec("ibc/A585C2D15DCD3B010849B453A2CFCB5E213208A5AB665691792684C26274304D", math.LegacyMustNewDecFromStr("7513.571999360713").QuoInt64(DecimalsAdjustment)), // OSMO,ibc/376222D6D9DAE23092E29740E56B758580935A6D77C24C2ABD57A6A78A1F3955,0.6699,1.070640882212,1.391833146872 sdk.NewDecCoinFromDec("ibc/376222D6D9DAE23092E29740E56B758580935A6D77C24C2ABD57A6A78A1F3955", math.LegacyMustNewDecFromStr("1.391833146872")), // DYM,ibc/4A6A46D4263F2ED3DCE9CF866FE15E6903FB5E12D87EB8BDC1B6B1A1E2D397B4,2.329,3.722231101167,4.838900431527 - sdk.NewDecCoinFromDec("ibc/4A6A46D4263F2ED3DCE9CF866FE15E6903FB5E12D87EB8BDC1B6B1A1E2D397B4", math.LegacyMustNewDecFromStr("4.838900431527")), + // 18 decimals coin + sdk.NewDecCoinFromDec("ibc/4A6A46D4263F2ED3DCE9CF866FE15E6903FB5E12D87EB8BDC1B6B1A1E2D397B4", math.LegacyMustNewDecFromStr("4.838900431527").QuoInt64(DecimalsAdjustment)), // DYDX,ibc/2CB87BCE0937B1D1DFCEE79BE4501AAF3C265E923509AEAC410AD85D27F35130,1.71,2.732939108199,3.552820840659 - sdk.NewDecCoinFromDec("ibc/2CB87BCE0937B1D1DFCEE79BE4501AAF3C265E923509AEAC410AD85D27F35130", math.LegacyMustNewDecFromStr("3.552820840659")), + // 18 decimals coin + sdk.NewDecCoinFromDec("ibc/2CB87BCE0937B1D1DFCEE79BE4501AAF3C265E923509AEAC410AD85D27F35130", math.LegacyMustNewDecFromStr("3.552820840659").QuoInt64(DecimalsAdjustment)), // KUJI,ibc/1053E271314D36FECBC915B51474F8B3962597CE88FF3E4A74795B0E3F367A8B,1.22,1.949816205849,2.534761067589 sdk.NewDecCoinFromDec("ibc/1053E271314D36FECBC915B51474F8B3962597CE88FF3E4A74795B0E3F367A8B", math.LegacyMustNewDecFromStr("2.534761067589")), From c8877f660a7d8997a6f87d1705898918fdd1f614 Mon Sep 17 00:00:00 2001 From: swelf Date: Mon, 24 Jun 2024 20:33:24 +0300 Subject: [PATCH 75/87] typos --- app/upgrades/v4.0.1/upgrades.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/upgrades/v4.0.1/upgrades.go b/app/upgrades/v4.0.1/upgrades.go index 098771fdb..86b053127 100644 --- a/app/upgrades/v4.0.1/upgrades.go +++ b/app/upgrades/v4.0.1/upgrades.go @@ -51,7 +51,7 @@ func CreateUpgradeHandler( if ctx.ChainID() != "pion-1" { // skip the migration set since - // the following changes already were applied on `pion-1` chain during `v4.0.1` release + // the following changes already were applied on `pion-1` chain during `v4.0.0-rc3` release ctx.Logger().Info("Setting consensus params...") err = enableVoteExtensions(ctx, keepers.ConsensusKeeper) if err != nil { @@ -96,7 +96,7 @@ func setMarketMapParams(ctx sdk.Context, marketmapKeeper *marketmapkeeper.Keeper } // NtrnPrices describes prices of any token in NTRN for dynamic fee resolver -// there are several 18decimals coins, we nned to adjust all the coins with the same base (6 decimals) prior to do any math +// there are several 18decimals coins, we need to adjust all the coins with the same base (6 decimals) prior to do any math // by dividing by 10^12 var NtrnPrices = sdk.NewDecCoins( // Token,Denom,TWAP30D (USD),Price in NTRN (30d TWAP of DENOM / 30d TWAP of NTRN),Price + 30% premium From 62a635829621e8943da619adef6e130e20687001 Mon Sep 17 00:00:00 2001 From: swelf Date: Tue, 25 Jun 2024 17:41:06 +0300 Subject: [PATCH 76/87] switched oracle and marketmap order --- app/app.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/app.go b/app/app.go index 8091d9426..27cd4dcde 100644 --- a/app/app.go +++ b/app/app.go @@ -1094,8 +1094,8 @@ func New( crontypes.ModuleName, globalfee.ModuleName, feemarkettypes.ModuleName, - marketmaptypes.ModuleName, oracletypes.ModuleName, + marketmaptypes.ModuleName, ibcswaptypes.ModuleName, dextypes.ModuleName, dynamicfeestypes.ModuleName, From 83b8cb73d84c57128efff7cdaead250195878390 Mon Sep 17 00:00:00 2001 From: swelf Date: Tue, 25 Jun 2024 19:17:17 +0300 Subject: [PATCH 77/87] updated consensus version of dex module --- x/dex/types/constants.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/dex/types/constants.go b/x/dex/types/constants.go index fef80f236..119d6c47e 100644 --- a/x/dex/types/constants.go +++ b/x/dex/types/constants.go @@ -1,3 +1,3 @@ package types -const ConsensusVersion = 3 +const ConsensusVersion = 4 From dd22e4f93d3607cac30242a6b2da248a1da129e1 Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Tue, 25 Jun 2024 19:48:46 +0300 Subject: [PATCH 78/87] remove testnet upgrade condition --- app/upgrades/v4.0.1/upgrades.go | 58 +++++++++++++++------------------ 1 file changed, 27 insertions(+), 31 deletions(-) diff --git a/app/upgrades/v4.0.1/upgrades.go b/app/upgrades/v4.0.1/upgrades.go index 86b053127..2897e2fb0 100644 --- a/app/upgrades/v4.0.1/upgrades.go +++ b/app/upgrades/v4.0.1/upgrades.go @@ -49,37 +49,33 @@ func CreateUpgradeHandler( return vm, err } - if ctx.ChainID() != "pion-1" { - // skip the migration set since - // the following changes already were applied on `pion-1` chain during `v4.0.0-rc3` release - ctx.Logger().Info("Setting consensus params...") - err = enableVoteExtensions(ctx, keepers.ConsensusKeeper) - if err != nil { - return nil, err - } - - ctx.Logger().Info("Setting marketmap params...") - err = setMarketMapParams(ctx, keepers.MarketmapKeeper) - if err != nil { - return nil, err - } - - ctx.Logger().Info("Setting dynamicfees/feemarket params...") - err = setFeeMarketParams(ctx, keepers.FeeMarketKeeper) - if err != nil { - return nil, err - } - - err = setDynamicFeesParams(ctx, keepers.DynamicfeesKeeper) - if err != nil { - return nil, err - } - - ctx.Logger().Info("Setting marketmap and oracle state...") - err = setMarketState(ctx, keepers.MarketmapKeeper) - if err != nil { - return nil, err - } + ctx.Logger().Info("Setting consensus params...") + err = enableVoteExtensions(ctx, keepers.ConsensusKeeper) + if err != nil { + return nil, err + } + + ctx.Logger().Info("Setting marketmap params...") + err = setMarketMapParams(ctx, keepers.MarketmapKeeper) + if err != nil { + return nil, err + } + + ctx.Logger().Info("Setting dynamicfees/feemarket params...") + err = setFeeMarketParams(ctx, keepers.FeeMarketKeeper) + if err != nil { + return nil, err + } + + err = setDynamicFeesParams(ctx, keepers.DynamicfeesKeeper) + if err != nil { + return nil, err + } + + ctx.Logger().Info("Setting marketmap and oracle state...") + err = setMarketState(ctx, keepers.MarketmapKeeper) + if err != nil { + return nil, err } ctx.Logger().Info(fmt.Sprintf("Migration {%s} applied", UpgradeName)) From 67a947784167b1541a872636451d26fc89d75777 Mon Sep 17 00:00:00 2001 From: swelf Date: Tue, 25 Jun 2024 20:05:58 +0300 Subject: [PATCH 79/87] generated swagger --- docs/static/swagger.yaml | 87 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/docs/static/swagger.yaml b/docs/static/swagger.yaml index a533cb0fa..26bf7a1b0 100644 --- a/docs/static/swagger.yaml +++ b/docs/static/swagger.yaml @@ -20100,6 +20100,31 @@ definitions: type: object type: array type: object + slinky.oracle.v1.GetCurrencyPairMappingResponse: + description: >- + GetCurrencyPairMappingResponse is the GetCurrencyPairMapping response + type. + properties: + currency_pair_mapping: + additionalProperties: + properties: + Base: + type: string + Quote: + type: string + title: >- + CurrencyPair is the standard representation of a pair of assets, + where one + + (Base) is priced in terms of the other (Quote) + type: object + description: >- + currency_pair_mapping is a mapping of the id representing the currency + pair + + to the currency pair itself. + type: object + type: object slinky.oracle.v1.GetPriceResponse: description: >- GetPriceResponse is the response from the GetPrice grpc method exposed @@ -44707,6 +44732,68 @@ paths: for. tags: - Query + /slinky/oracle/v1/get_currency_pair_mapping: + get: + operationId: GetCurrencyPairMapping + responses: + '200': + description: A successful response. + schema: + description: >- + GetCurrencyPairMappingResponse is the GetCurrencyPairMapping + response type. + properties: + currency_pair_mapping: + additionalProperties: + properties: + Base: + type: string + Quote: + type: string + title: >- + CurrencyPair is the standard representation of a pair of + assets, where one + + (Base) is priced in terms of the other (Quote) + type: object + description: >- + currency_pair_mapping is a mapping of the id representing the + currency pair + + to the currency pair itself. + type: object + type: object + default: + description: An unexpected error response. + schema: + properties: + code: + format: int32 + type: integer + details: + items: + properties: + type_url: + type: string + value: + format: byte + type: string + type: object + type: array + error: + type: string + message: + type: string + type: object + summary: >- + Get the mapping of currency pair ID -> currency pair. This is useful for + + indexers that have access to the ID of a currency pair, but no way to + get + + the underlying currency pair from it. + tags: + - Query /slinky/oracle/v1/get_price: get: operationId: GetPrice From 7ef392864a30688036248df577c01cfdfb431aec Mon Sep 17 00:00:00 2001 From: Steffen Date: Thu, 27 Jun 2024 06:16:03 +0200 Subject: [PATCH 80/87] feature: enable docker build for tags Enable docker build for tags. --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index afb5a822c..91662dc04 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,6 +2,8 @@ name: CI on: push: + tags: + - v* branches: - "main" - "releases/v3.x" From 86ece42f64832423e99255c1028d9fdd2afc7f22 Mon Sep 17 00:00:00 2001 From: keylogic1 <119584546+keylogic1@users.noreply.github.com> Date: Thu, 27 Jun 2024 14:23:16 +0300 Subject: [PATCH 81/87] Update ci.yml --- .github/workflows/ci.yml | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index afb5a822c..9d82cd3a3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,6 +2,8 @@ name: CI on: push: + tags: + - "*" branches: - "main" - "releases/v3.x" @@ -11,6 +13,12 @@ on: - "main" - "releases/v3.x" - "chore/fix-ci" + workflow_dispatch: + inputs: + tag: + description: 'Tag to run the workflow for' + required: false + default: '' jobs: docker: @@ -44,9 +52,15 @@ jobs: curl --silent -L --output ~/.docker/cli-plugins/docker-buildx $BUILDX_URL chmod a+x ~/.docker/cli-plugins/docker-buildx - - name: Get version from git tags + - name: Get version from git tags or input id: get_version - run: echo "VERSION=v$(git describe --tags --abbrev=0 | sed 's/^v//')" >> $GITHUB_ENV + run: | + if [ -n "${{ github.event.inputs.tag }}" ]; then + VERSION=${{ github.event.inputs.tag }} + else + VERSION=$(git describe --tags --abbrev=0) + fi + echo "VERSION=$VERSION" >> $GITHUB_ENV - name: Log in to Docker Hub run: echo "${{ secrets.DOCKERHUB_TOKEN }}" | docker login --username ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin @@ -60,16 +74,6 @@ jobs: endpoint: "neutronorg/neutron" install: true -# - name: Build and push -# uses: docker/build-push-action@v5 -# with: -# context: . -# file: Dockerfile.builder -# tags: "${{ env.VERSION }}" -# # For pull requests, export results to the build cache. -# # Otherwise, push to a registry. -# outputs: ${{ github.event_name == 'pull_request' && 'type=cacheonly' || 'type=registry,push=true' }} - - name: Build and push Docker image env: VERSION: ${{ env.VERSION }} @@ -82,4 +86,3 @@ jobs: - name: Cleanup temporary container run: docker rm -f neutronbinary || true - From 5c01d10710d8060f05497bb60d715075e5e2c2cb Mon Sep 17 00:00:00 2001 From: keylogic1 <119584546+keylogic1@users.noreply.github.com> Date: Thu, 27 Jun 2024 14:31:50 +0300 Subject: [PATCH 82/87] CI - Use tag if provided --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9d82cd3a3..39921ed28 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -31,6 +31,7 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 + ref: ${{ github.event.inputs.tag || github.ref }} - name: Install dependencies run: sudo apt-get update && sudo apt-get install -y jq curl git From 0f830585de0203bd95681ac229b93ff8b9a2b2c7 Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Fri, 28 Jun 2024 14:55:28 +0300 Subject: [PATCH 83/87] don't format pb files --- Makefile | 9 ++++----- x/contractmanager/types/failure.pb.go | 5 ++--- x/contractmanager/types/genesis.pb.go | 5 ++--- x/contractmanager/types/params.pb.go | 5 ++--- x/contractmanager/types/query.pb.go | 7 +++---- x/contractmanager/types/tx.pb.go | 7 +++---- x/contractmanager/types/v1/failure.pb.go | 3 +-- x/cron/types/genesis.pb.go | 5 ++--- x/cron/types/params.pb.go | 5 ++--- x/cron/types/query.pb.go | 7 +++---- x/cron/types/schedule.pb.go | 5 ++--- x/cron/types/tx.pb.go | 7 +++---- x/dex/types/deposit_record.pb.go | 7 +++---- x/dex/types/genesis.pb.go | 5 ++--- x/dex/types/limit_order_expiration.pb.go | 9 ++++----- x/dex/types/limit_order_tranche.pb.go | 14 ++++++-------- x/dex/types/limit_order_tranche_user.pb.go | 7 +++---- x/dex/types/pair_id.pb.go | 3 +-- x/dex/types/params.pb.go | 5 ++--- x/dex/types/pool.pb.go | 5 ++--- x/dex/types/pool_metadata.pb.go | 3 +-- x/dex/types/pool_reserves.pb.go | 10 ++++------ x/dex/types/query.pb.go | 14 ++++++-------- x/dex/types/tick_liquidity.pb.go | 5 ++--- x/dex/types/trade_pair_id.pb.go | 3 +-- x/dex/types/tx.pb.go | 14 ++++++-------- x/dex/types/v2/params.pb.go | 8 +++----- x/dynamicfees/types/genesis.pb.go | 5 ++--- x/dynamicfees/types/params.pb.go | 7 +++---- x/dynamicfees/types/query.pb.go | 7 +++---- x/dynamicfees/types/tx.pb.go | 7 +++---- x/feeburner/types/genesis.pb.go | 5 ++--- x/feeburner/types/params.pb.go | 5 ++--- x/feeburner/types/query.pb.go | 7 +++---- .../types/total_burned_neutrons_amount.pb.go | 7 +++---- x/feeburner/types/tx.pb.go | 7 +++---- x/feerefunder/types/fee.pb.go | 7 +++---- x/feerefunder/types/genesis.pb.go | 5 ++--- x/feerefunder/types/params.pb.go | 5 ++--- x/feerefunder/types/query.pb.go | 7 +++---- x/feerefunder/types/tx.pb.go | 7 +++---- x/globalfee/types/genesis.pb.go | 5 ++--- x/globalfee/types/params.pb.go | 7 +++---- x/globalfee/types/query.pb.go | 7 +++---- x/globalfee/types/tx.pb.go | 7 +++---- x/interchainqueries/types/genesis.pb.go | 7 +++---- x/interchainqueries/types/params.pb.go | 7 +++---- x/interchainqueries/types/query.pb.go | 7 +++---- x/interchainqueries/types/tx.pb.go | 7 +++---- x/interchaintxs/types/genesis.pb.go | 5 ++--- x/interchaintxs/types/params.pb.go | 7 +++---- x/interchaintxs/types/query.pb.go | 7 +++---- x/interchaintxs/types/tx.pb.go | 10 ++++------ x/tokenfactory/types/authorityMetadata.pb.go | 7 +++---- x/tokenfactory/types/genesis.pb.go | 5 ++--- x/tokenfactory/types/params.pb.go | 7 +++---- x/tokenfactory/types/query.pb.go | 7 +++---- x/tokenfactory/types/tx.pb.go | 7 +++---- x/tokenfactory/types/v1beta1/params.pb.go | 7 +++---- x/transfer/types/query.pb.go | 3 +-- x/transfer/types/tx.pb.go | 10 ++++------ 61 files changed, 169 insertions(+), 237 deletions(-) diff --git a/Makefile b/Makefile index 1e2805b22..9c8a00e2d 100644 --- a/Makefile +++ b/Makefile @@ -202,15 +202,14 @@ test-sim-multi-seed-short: runsim ############################################################################### lint: - golangci-lint run - find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -path "*_test.go" | xargs gofmt -d -s + golangci-lint run --skip-files ".*.pb.go" + find . -name '*.go' -not -name "*.pb.go" -type f -not -path "./vendor*" -not -path "*.git*" -not -path "*_test.go" | xargs gofmt -d -s format: @go install mvdan.cc/gofumpt@latest @go install github.com/golangci/golangci-lint/cmd/golangci-lint@$(GOLANGCI_LINT_VERSION) - find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -path "./client/docs/statik/statik.go" -not -path "./tests/mocks/*" -not -name "*.pb.go" -not -name "*.pb.gw.go" -not -name "*.pulsar.go" -not -path "./crypto/keys/secp256k1/*" | xargs gofumpt -w -l - golangci-lint run --fix - goimports -w -local github.com/neutron-org . + find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -path "./client/docs/statik/statik.go" -not -path "./tests/mocks/*" -not -name "*.pb.go" -not -name "*.pb.gw.go" -not -name "*.pulsar.go" -not -path "./crypto/keys/secp256k1/*" | xargs -I % sh -c 'gofumpt -w -l % && goimports -w -local github.com/neutron-org %' + golangci-lint run --fix --skip-files ".*.pb.go" .PHONY: format diff --git a/x/contractmanager/types/failure.pb.go b/x/contractmanager/types/failure.pb.go index 108230c3d..635899d81 100644 --- a/x/contractmanager/types/failure.pb.go +++ b/x/contractmanager/types/failure.pb.go @@ -5,12 +5,11 @@ package types import ( fmt "fmt" + proto "github.com/cosmos/gogoproto/proto" + _ "github.com/cosmos/ibc-go/v8/modules/core/04-channel/types" io "io" math "math" math_bits "math/bits" - - proto "github.com/cosmos/gogoproto/proto" - _ "github.com/cosmos/ibc-go/v8/modules/core/04-channel/types" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/contractmanager/types/genesis.pb.go b/x/contractmanager/types/genesis.pb.go index 198452eec..fbf415eda 100644 --- a/x/contractmanager/types/genesis.pb.go +++ b/x/contractmanager/types/genesis.pb.go @@ -5,12 +5,11 @@ package types import ( fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" - - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/contractmanager/types/params.pb.go b/x/contractmanager/types/params.pb.go index 2ca0e44c5..a3294bbd0 100644 --- a/x/contractmanager/types/params.pb.go +++ b/x/contractmanager/types/params.pb.go @@ -5,12 +5,11 @@ package types import ( fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" - - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/contractmanager/types/query.pb.go b/x/contractmanager/types/query.pb.go index 7e3209a8c..b5b0f5543 100644 --- a/x/contractmanager/types/query.pb.go +++ b/x/contractmanager/types/query.pb.go @@ -6,10 +6,6 @@ package types import ( context "context" fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - query "github.com/cosmos/cosmos-sdk/types/query" _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" @@ -18,6 +14,9 @@ import ( 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. diff --git a/x/contractmanager/types/tx.pb.go b/x/contractmanager/types/tx.pb.go index eaad796ed..3a69490ae 100644 --- a/x/contractmanager/types/tx.pb.go +++ b/x/contractmanager/types/tx.pb.go @@ -6,10 +6,6 @@ package types import ( context "context" fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - _ "github.com/cosmos/cosmos-proto" _ "github.com/cosmos/cosmos-sdk/types/msgservice" _ "github.com/cosmos/cosmos-sdk/types/tx/amino" @@ -19,6 +15,9 @@ import ( 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. diff --git a/x/contractmanager/types/v1/failure.pb.go b/x/contractmanager/types/v1/failure.pb.go index af2f28754..597eb369b 100644 --- a/x/contractmanager/types/v1/failure.pb.go +++ b/x/contractmanager/types/v1/failure.pb.go @@ -5,11 +5,10 @@ package v1 import ( fmt "fmt" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" - - proto "github.com/cosmos/gogoproto/proto" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/cron/types/genesis.pb.go b/x/cron/types/genesis.pb.go index 6853c1bb0..2d3546994 100644 --- a/x/cron/types/genesis.pb.go +++ b/x/cron/types/genesis.pb.go @@ -5,12 +5,11 @@ package types import ( fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" - - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/cron/types/params.pb.go b/x/cron/types/params.pb.go index 5a10eefdc..c71904ce8 100644 --- a/x/cron/types/params.pb.go +++ b/x/cron/types/params.pb.go @@ -5,12 +5,11 @@ package types import ( fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" - - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/cron/types/query.pb.go b/x/cron/types/query.pb.go index 20f19b2cc..c34c6c3f9 100644 --- a/x/cron/types/query.pb.go +++ b/x/cron/types/query.pb.go @@ -6,10 +6,6 @@ package types import ( context "context" fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - query "github.com/cosmos/cosmos-sdk/types/query" _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" @@ -18,6 +14,9 @@ import ( 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. diff --git a/x/cron/types/schedule.pb.go b/x/cron/types/schedule.pb.go index f9c1893cc..cda29cf72 100644 --- a/x/cron/types/schedule.pb.go +++ b/x/cron/types/schedule.pb.go @@ -5,12 +5,11 @@ package types import ( fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" - - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/cron/types/tx.pb.go b/x/cron/types/tx.pb.go index 68d972249..217bb879c 100644 --- a/x/cron/types/tx.pb.go +++ b/x/cron/types/tx.pb.go @@ -6,10 +6,6 @@ package types import ( context "context" fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - _ "github.com/cosmos/cosmos-proto" _ "github.com/cosmos/cosmos-sdk/types/msgservice" _ "github.com/cosmos/cosmos-sdk/types/tx/amino" @@ -19,6 +15,9 @@ import ( 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. diff --git a/x/dex/types/deposit_record.pb.go b/x/dex/types/deposit_record.pb.go index 0941327f6..8d3ca7286 100644 --- a/x/dex/types/deposit_record.pb.go +++ b/x/dex/types/deposit_record.pb.go @@ -4,14 +4,13 @@ package types import ( + cosmossdk_io_math "cosmossdk.io/math" fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" - - cosmossdk_io_math "cosmossdk.io/math" - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/dex/types/genesis.pb.go b/x/dex/types/genesis.pb.go index 474636568..167877ac6 100644 --- a/x/dex/types/genesis.pb.go +++ b/x/dex/types/genesis.pb.go @@ -5,12 +5,11 @@ package types import ( fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" - - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/dex/types/limit_order_expiration.pb.go b/x/dex/types/limit_order_expiration.pb.go index 27544964d..c983de898 100644 --- a/x/dex/types/limit_order_expiration.pb.go +++ b/x/dex/types/limit_order_expiration.pb.go @@ -5,15 +5,14 @@ package types import ( fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - time "time" - _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" _ "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. diff --git a/x/dex/types/limit_order_tranche.pb.go b/x/dex/types/limit_order_tranche.pb.go index 79df59140..e35ecd9cc 100644 --- a/x/dex/types/limit_order_tranche.pb.go +++ b/x/dex/types/limit_order_tranche.pb.go @@ -4,19 +4,17 @@ package types import ( - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - time "time" - cosmossdk_io_math "cosmossdk.io/math" + fmt "fmt" _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" - _ "google.golang.org/protobuf/types/known/timestamppb" - github_com_neutron_org_neutron_v4_utils_math "github.com/neutron-org/neutron/v4/utils/math" + _ "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. diff --git a/x/dex/types/limit_order_tranche_user.pb.go b/x/dex/types/limit_order_tranche_user.pb.go index 75737b1c2..b0e65087b 100644 --- a/x/dex/types/limit_order_tranche_user.pb.go +++ b/x/dex/types/limit_order_tranche_user.pb.go @@ -4,14 +4,13 @@ package types import ( + cosmossdk_io_math "cosmossdk.io/math" fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" - - cosmossdk_io_math "cosmossdk.io/math" - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/dex/types/pair_id.pb.go b/x/dex/types/pair_id.pb.go index 5d72b9f75..1b97bd856 100644 --- a/x/dex/types/pair_id.pb.go +++ b/x/dex/types/pair_id.pb.go @@ -5,11 +5,10 @@ package types import ( fmt "fmt" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" - - proto "github.com/cosmos/gogoproto/proto" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/dex/types/params.pb.go b/x/dex/types/params.pb.go index 28d0899dd..ca28efd3e 100644 --- a/x/dex/types/params.pb.go +++ b/x/dex/types/params.pb.go @@ -5,12 +5,11 @@ package types import ( fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" - - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/dex/types/pool.pb.go b/x/dex/types/pool.pb.go index c33507555..7468d843b 100644 --- a/x/dex/types/pool.pb.go +++ b/x/dex/types/pool.pb.go @@ -5,12 +5,11 @@ package types import ( fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" - - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/dex/types/pool_metadata.pb.go b/x/dex/types/pool_metadata.pb.go index 03aaaed20..47c15c2ae 100644 --- a/x/dex/types/pool_metadata.pb.go +++ b/x/dex/types/pool_metadata.pb.go @@ -5,11 +5,10 @@ package types import ( fmt "fmt" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" - - proto "github.com/cosmos/gogoproto/proto" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/dex/types/pool_reserves.pb.go b/x/dex/types/pool_reserves.pb.go index c889d1e69..10e0f6d50 100644 --- a/x/dex/types/pool_reserves.pb.go +++ b/x/dex/types/pool_reserves.pb.go @@ -4,16 +4,14 @@ package types import ( - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - cosmossdk_io_math "cosmossdk.io/math" + fmt "fmt" _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" - github_com_neutron_org_neutron_v4_utils_math "github.com/neutron-org/neutron/v4/utils/math" + io "io" + math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/dex/types/query.pb.go b/x/dex/types/query.pb.go index 953d59f96..9450a4a07 100644 --- a/x/dex/types/query.pb.go +++ b/x/dex/types/query.pb.go @@ -5,13 +5,8 @@ package types import ( context "context" - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - time "time" - cosmossdk_io_math "cosmossdk.io/math" + fmt "fmt" _ "github.com/cosmos/cosmos-sdk/types" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" query "github.com/cosmos/cosmos-sdk/types/query" @@ -19,13 +14,16 @@ import ( grpc1 "github.com/cosmos/gogoproto/grpc" proto "github.com/cosmos/gogoproto/proto" github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" + github_com_neutron_org_neutron_v4_utils_math "github.com/neutron-org/neutron/v4/utils/math" _ "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" - - github_com_neutron_org_neutron_v4_utils_math "github.com/neutron-org/neutron/v4/utils/math" + io "io" + math "math" + math_bits "math/bits" + time "time" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/dex/types/tick_liquidity.pb.go b/x/dex/types/tick_liquidity.pb.go index 0f2443566..c35f64b63 100644 --- a/x/dex/types/tick_liquidity.pb.go +++ b/x/dex/types/tick_liquidity.pb.go @@ -5,12 +5,11 @@ package types import ( fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" - - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/dex/types/trade_pair_id.pb.go b/x/dex/types/trade_pair_id.pb.go index 3c4f1980e..d2d64ef4e 100644 --- a/x/dex/types/trade_pair_id.pb.go +++ b/x/dex/types/trade_pair_id.pb.go @@ -5,11 +5,10 @@ package types import ( fmt "fmt" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" - - proto "github.com/cosmos/gogoproto/proto" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/dex/types/tx.pb.go b/x/dex/types/tx.pb.go index f94f0bee3..433e795c2 100644 --- a/x/dex/types/tx.pb.go +++ b/x/dex/types/tx.pb.go @@ -5,13 +5,8 @@ package types import ( context "context" - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - time "time" - cosmossdk_io_math "cosmossdk.io/math" + fmt "fmt" _ "github.com/cosmos/cosmos-proto" _ "github.com/cosmos/cosmos-sdk/types" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" @@ -21,12 +16,15 @@ import ( grpc1 "github.com/cosmos/gogoproto/grpc" proto "github.com/cosmos/gogoproto/proto" github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" + github_com_neutron_org_neutron_v4_utils_math "github.com/neutron-org/neutron/v4/utils/math" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" _ "google.golang.org/protobuf/types/known/timestamppb" - - github_com_neutron_org_neutron_v4_utils_math "github.com/neutron-org/neutron/v4/utils/math" + io "io" + math "math" + math_bits "math/bits" + time "time" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/dex/types/v2/params.pb.go b/x/dex/types/v2/params.pb.go index 297167892..b6e4ad499 100644 --- a/x/dex/types/v2/params.pb.go +++ b/x/dex/types/v2/params.pb.go @@ -5,14 +5,12 @@ package v2 import ( fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" - github_com_neutron_org_neutron_v4_utils_math "github.com/neutron-org/neutron/v4/utils/math" + io "io" + math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/dynamicfees/types/genesis.pb.go b/x/dynamicfees/types/genesis.pb.go index a5f13a155..ff1c4b185 100644 --- a/x/dynamicfees/types/genesis.pb.go +++ b/x/dynamicfees/types/genesis.pb.go @@ -5,12 +5,11 @@ package types import ( fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" - - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/dynamicfees/types/params.pb.go b/x/dynamicfees/types/params.pb.go index 130de4b33..cd6c8940e 100644 --- a/x/dynamicfees/types/params.pb.go +++ b/x/dynamicfees/types/params.pb.go @@ -5,14 +5,13 @@ package types import ( fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" + io "io" + math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/dynamicfees/types/query.pb.go b/x/dynamicfees/types/query.pb.go index ef6c9cb99..51fb31b92 100644 --- a/x/dynamicfees/types/query.pb.go +++ b/x/dynamicfees/types/query.pb.go @@ -6,10 +6,6 @@ package types import ( context "context" fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" proto "github.com/cosmos/gogoproto/proto" @@ -17,6 +13,9 @@ import ( 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. diff --git a/x/dynamicfees/types/tx.pb.go b/x/dynamicfees/types/tx.pb.go index 8ba50ed26..a2dc42872 100644 --- a/x/dynamicfees/types/tx.pb.go +++ b/x/dynamicfees/types/tx.pb.go @@ -6,10 +6,6 @@ package types import ( context "context" fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - _ "github.com/cosmos/cosmos-proto" _ "github.com/cosmos/cosmos-sdk/types/msgservice" _ "github.com/cosmos/cosmos-sdk/types/tx/amino" @@ -19,6 +15,9 @@ import ( 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. diff --git a/x/feeburner/types/genesis.pb.go b/x/feeburner/types/genesis.pb.go index b378b9102..817cad2ff 100644 --- a/x/feeburner/types/genesis.pb.go +++ b/x/feeburner/types/genesis.pb.go @@ -5,12 +5,11 @@ package types import ( fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" - - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/feeburner/types/params.pb.go b/x/feeburner/types/params.pb.go index 76c19721e..2f539541e 100644 --- a/x/feeburner/types/params.pb.go +++ b/x/feeburner/types/params.pb.go @@ -5,12 +5,11 @@ package types import ( fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" - - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/feeburner/types/query.pb.go b/x/feeburner/types/query.pb.go index 8a3622a36..ea85ae590 100644 --- a/x/feeburner/types/query.pb.go +++ b/x/feeburner/types/query.pb.go @@ -6,10 +6,6 @@ package types import ( context "context" fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - _ "github.com/cosmos/cosmos-sdk/types/query" _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" @@ -18,6 +14,9 @@ import ( 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. diff --git a/x/feeburner/types/total_burned_neutrons_amount.pb.go b/x/feeburner/types/total_burned_neutrons_amount.pb.go index 438b721a3..8e9acf9f1 100644 --- a/x/feeburner/types/total_burned_neutrons_amount.pb.go +++ b/x/feeburner/types/total_burned_neutrons_amount.pb.go @@ -5,13 +5,12 @@ package types import ( fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" + io "io" + math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/feeburner/types/tx.pb.go b/x/feeburner/types/tx.pb.go index d0c1092f9..d25168e3c 100644 --- a/x/feeburner/types/tx.pb.go +++ b/x/feeburner/types/tx.pb.go @@ -6,10 +6,6 @@ package types import ( context "context" fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - _ "github.com/cosmos/cosmos-proto" _ "github.com/cosmos/cosmos-sdk/types/msgservice" _ "github.com/cosmos/cosmos-sdk/types/tx/amino" @@ -19,6 +15,9 @@ import ( 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. diff --git a/x/feerefunder/types/fee.pb.go b/x/feerefunder/types/fee.pb.go index e69c14109..540bc0581 100644 --- a/x/feerefunder/types/fee.pb.go +++ b/x/feerefunder/types/fee.pb.go @@ -5,14 +5,13 @@ package types import ( fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" + io "io" + math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/feerefunder/types/genesis.pb.go b/x/feerefunder/types/genesis.pb.go index 800255d34..682002bcf 100644 --- a/x/feerefunder/types/genesis.pb.go +++ b/x/feerefunder/types/genesis.pb.go @@ -5,12 +5,11 @@ package types import ( fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" - - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/feerefunder/types/params.pb.go b/x/feerefunder/types/params.pb.go index 62f1e84fa..1bdb0da76 100644 --- a/x/feerefunder/types/params.pb.go +++ b/x/feerefunder/types/params.pb.go @@ -5,12 +5,11 @@ package types import ( fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" - - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/feerefunder/types/query.pb.go b/x/feerefunder/types/query.pb.go index fe73033ba..7bd8573fa 100644 --- a/x/feerefunder/types/query.pb.go +++ b/x/feerefunder/types/query.pb.go @@ -6,10 +6,6 @@ package types import ( context "context" fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - _ "github.com/cosmos/cosmos-sdk/types/query" _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" @@ -18,6 +14,9 @@ import ( 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. diff --git a/x/feerefunder/types/tx.pb.go b/x/feerefunder/types/tx.pb.go index 8aaab733d..3688fce95 100644 --- a/x/feerefunder/types/tx.pb.go +++ b/x/feerefunder/types/tx.pb.go @@ -6,10 +6,6 @@ package types import ( context "context" fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - _ "github.com/cosmos/cosmos-proto" _ "github.com/cosmos/cosmos-sdk/types/msgservice" _ "github.com/cosmos/cosmos-sdk/types/tx/amino" @@ -19,6 +15,9 @@ import ( 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. diff --git a/x/globalfee/types/genesis.pb.go b/x/globalfee/types/genesis.pb.go index 49f7929e2..349c454df 100644 --- a/x/globalfee/types/genesis.pb.go +++ b/x/globalfee/types/genesis.pb.go @@ -5,12 +5,11 @@ package types import ( fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" - - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/globalfee/types/params.pb.go b/x/globalfee/types/params.pb.go index caae5be0a..f6bc1a627 100644 --- a/x/globalfee/types/params.pb.go +++ b/x/globalfee/types/params.pb.go @@ -5,14 +5,13 @@ package types import ( fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" + io "io" + math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/globalfee/types/query.pb.go b/x/globalfee/types/query.pb.go index 4e5e58d3e..1f802433c 100644 --- a/x/globalfee/types/query.pb.go +++ b/x/globalfee/types/query.pb.go @@ -6,10 +6,6 @@ package types import ( context "context" fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" proto "github.com/cosmos/gogoproto/proto" @@ -17,6 +13,9 @@ import ( 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. diff --git a/x/globalfee/types/tx.pb.go b/x/globalfee/types/tx.pb.go index 5b61253dc..31da98227 100644 --- a/x/globalfee/types/tx.pb.go +++ b/x/globalfee/types/tx.pb.go @@ -6,10 +6,6 @@ package types import ( context "context" fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - _ "github.com/cosmos/cosmos-proto" _ "github.com/cosmos/cosmos-sdk/types/msgservice" _ "github.com/cosmos/cosmos-sdk/types/tx/amino" @@ -19,6 +15,9 @@ import ( 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. diff --git a/x/interchainqueries/types/genesis.pb.go b/x/interchainqueries/types/genesis.pb.go index ef69e7dd3..1af0782c0 100644 --- a/x/interchainqueries/types/genesis.pb.go +++ b/x/interchainqueries/types/genesis.pb.go @@ -5,15 +5,14 @@ package types import ( fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types1 "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" types "github.com/cosmos/ibc-go/v8/modules/core/02-client/types" + io "io" + math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/interchainqueries/types/params.pb.go b/x/interchainqueries/types/params.pb.go index db88e9007..5afc785e0 100644 --- a/x/interchainqueries/types/params.pb.go +++ b/x/interchainqueries/types/params.pb.go @@ -5,14 +5,13 @@ package types import ( fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" + io "io" + math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/interchainqueries/types/query.pb.go b/x/interchainqueries/types/query.pb.go index 0f1972e02..03dd0fb7a 100644 --- a/x/interchainqueries/types/query.pb.go +++ b/x/interchainqueries/types/query.pb.go @@ -6,10 +6,6 @@ package types import ( context "context" fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - query "github.com/cosmos/cosmos-sdk/types/query" _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" @@ -18,6 +14,9 @@ import ( 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. diff --git a/x/interchainqueries/types/tx.pb.go b/x/interchainqueries/types/tx.pb.go index a4a4ca2d9..4d6a49cee 100644 --- a/x/interchainqueries/types/tx.pb.go +++ b/x/interchainqueries/types/tx.pb.go @@ -6,10 +6,6 @@ package types import ( context "context" fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - types1 "github.com/cometbft/cometbft/abci/types" crypto "github.com/cometbft/cometbft/proto/tendermint/crypto" _ "github.com/cosmos/cosmos-proto" @@ -22,6 +18,9 @@ import ( 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. diff --git a/x/interchaintxs/types/genesis.pb.go b/x/interchaintxs/types/genesis.pb.go index 85e6a2c74..25770ae3c 100644 --- a/x/interchaintxs/types/genesis.pb.go +++ b/x/interchaintxs/types/genesis.pb.go @@ -5,12 +5,11 @@ package types import ( fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" - - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/interchaintxs/types/params.pb.go b/x/interchaintxs/types/params.pb.go index 3012954b6..e2f86cfc9 100644 --- a/x/interchaintxs/types/params.pb.go +++ b/x/interchaintxs/types/params.pb.go @@ -5,13 +5,12 @@ package types import ( fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" + io "io" + math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/interchaintxs/types/query.pb.go b/x/interchaintxs/types/query.pb.go index 1518bda64..5f71e842b 100644 --- a/x/interchaintxs/types/query.pb.go +++ b/x/interchaintxs/types/query.pb.go @@ -6,10 +6,6 @@ package types import ( context "context" fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - _ "github.com/cosmos/cosmos-sdk/types/query" _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" @@ -18,6 +14,9 @@ import ( 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. diff --git a/x/interchaintxs/types/tx.pb.go b/x/interchaintxs/types/tx.pb.go index 9f5693111..8b7fb7755 100644 --- a/x/interchaintxs/types/tx.pb.go +++ b/x/interchaintxs/types/tx.pb.go @@ -6,10 +6,6 @@ package types import ( context "context" fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - _ "github.com/cosmos/cosmos-proto" types1 "github.com/cosmos/cosmos-sdk/codec/types" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" @@ -19,12 +15,14 @@ import ( _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" proto "github.com/cosmos/gogoproto/proto" + types2 "github.com/neutron-org/neutron/v4/x/feerefunder/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" - - types2 "github.com/neutron-org/neutron/v4/x/feerefunder/types" + io "io" + math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/tokenfactory/types/authorityMetadata.pb.go b/x/tokenfactory/types/authorityMetadata.pb.go index 3d12d5ed5..ad2ace108 100644 --- a/x/tokenfactory/types/authorityMetadata.pb.go +++ b/x/tokenfactory/types/authorityMetadata.pb.go @@ -5,13 +5,12 @@ package types import ( fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - _ "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" + io "io" + math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/tokenfactory/types/genesis.pb.go b/x/tokenfactory/types/genesis.pb.go index cd03eb3bb..3415f1e6c 100644 --- a/x/tokenfactory/types/genesis.pb.go +++ b/x/tokenfactory/types/genesis.pb.go @@ -5,12 +5,11 @@ package types import ( fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" io "io" math "math" math_bits "math/bits" - - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/tokenfactory/types/params.pb.go b/x/tokenfactory/types/params.pb.go index 48cfdb88f..a5b112b5a 100644 --- a/x/tokenfactory/types/params.pb.go +++ b/x/tokenfactory/types/params.pb.go @@ -5,15 +5,14 @@ package types import ( fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - _ "github.com/cosmos/cosmos-proto" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" + io "io" + math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/tokenfactory/types/query.pb.go b/x/tokenfactory/types/query.pb.go index 3d6b122ff..5e6fb2b06 100644 --- a/x/tokenfactory/types/query.pb.go +++ b/x/tokenfactory/types/query.pb.go @@ -6,10 +6,6 @@ package types import ( context "context" fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" proto "github.com/cosmos/gogoproto/proto" @@ -17,6 +13,9 @@ import ( 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. diff --git a/x/tokenfactory/types/tx.pb.go b/x/tokenfactory/types/tx.pb.go index 236c58ed4..e20ba1f2c 100644 --- a/x/tokenfactory/types/tx.pb.go +++ b/x/tokenfactory/types/tx.pb.go @@ -6,10 +6,6 @@ package types import ( context "context" fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - _ "github.com/cosmos/cosmos-proto" types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/cosmos-sdk/types/msgservice" @@ -21,6 +17,9 @@ import ( 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. diff --git a/x/tokenfactory/types/v1beta1/params.pb.go b/x/tokenfactory/types/v1beta1/params.pb.go index 2cf60f11d..cf863a97c 100644 --- a/x/tokenfactory/types/v1beta1/params.pb.go +++ b/x/tokenfactory/types/v1beta1/params.pb.go @@ -5,15 +5,14 @@ package v1beta1 import ( fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - _ "github.com/cosmos/cosmos-proto" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" + io "io" + math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/transfer/types/query.pb.go b/x/transfer/types/query.pb.go index 499576586..4d562d622 100644 --- a/x/transfer/types/query.pb.go +++ b/x/transfer/types/query.pb.go @@ -6,8 +6,6 @@ package types import ( context "context" fmt "fmt" - math "math" - grpc1 "github.com/cosmos/gogoproto/grpc" proto "github.com/cosmos/gogoproto/proto" types "github.com/cosmos/ibc-go/v8/modules/apps/transfer/types" @@ -15,6 +13,7 @@ import ( grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" + math "math" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/transfer/types/tx.pb.go b/x/transfer/types/tx.pb.go index 5f1c663ba..94361dafa 100644 --- a/x/transfer/types/tx.pb.go +++ b/x/transfer/types/tx.pb.go @@ -6,10 +6,6 @@ package types import ( context "context" fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/cosmos-sdk/types/msgservice" _ "github.com/cosmos/gogoproto/gogoproto" @@ -17,11 +13,13 @@ import ( proto "github.com/cosmos/gogoproto/proto" types3 "github.com/cosmos/ibc-go/v8/modules/apps/transfer/types" types1 "github.com/cosmos/ibc-go/v8/modules/core/02-client/types" + types2 "github.com/neutron-org/neutron/v4/x/feerefunder/types" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" - - types2 "github.com/neutron-org/neutron/v4/x/feerefunder/types" + io "io" + math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. From 0bb064f7e28aa14da3c9cc5de64e9aae14818b3a Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Tue, 2 Jul 2024 17:27:54 +0300 Subject: [PATCH 84/87] fix statesync.bash by specifiyng min-gas-prices --- contrib/statesync.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/statesync.bash b/contrib/statesync.bash index 96d84b989..c314af9aa 100644 --- a/contrib/statesync.bash +++ b/contrib/statesync.bash @@ -70,4 +70,4 @@ NEUTROND_P2P_SEEDS=$(curl -s https://raw.githubusercontent.com/cosmos/chain-regi export NEUTROND_P2P_SEEDS # Start chain. -neutrond start --x-crisis-skip-assert-invariants --iavl-disable-fastnode false +neutrond start --x-crisis-skip-assert-invariants --iavl-disable-fastnode false --minimum-gas-prices 0untrn From ff4b9779a87849f1e7d449d55c5d078c86325ecc Mon Sep 17 00:00:00 2001 From: Julian Compagni Portis Date: Tue, 2 Jul 2024 12:33:44 -0400 Subject: [PATCH 85/87] Allow FeeCollectorAddress to be valid when setting Tokenfactory params This fixes the issue where MsgUpdateParams.Validate() only passes when FeeCollectorAddress is set. It should be possible to set params with an empty FeeCollectorAddress --- x/tokenfactory/keeper/msg_server_test.go | 18 +++++++++++++++--- x/tokenfactory/types/tx.go | 6 ------ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/x/tokenfactory/keeper/msg_server_test.go b/x/tokenfactory/keeper/msg_server_test.go index 5130f266b..fd51c7a4f 100644 --- a/x/tokenfactory/keeper/msg_server_test.go +++ b/x/tokenfactory/keeper/msg_server_test.go @@ -869,24 +869,36 @@ func TestMsgUpdateParamsValidate(t *testing.T) { "authority is invalid", }, { - "empty fee_collector_address", + "empty fee_collector_address with denom_creation_fee", types.MsgUpdateParams{ Authority: testutil.TestOwnerAddress, Params: types.Params{ FeeCollectorAddress: "", + DenomCreationFee: sdktypes.NewCoins(sdktypes.NewCoin("untrn", math.OneInt())), }, }, - "fee_collector_address is invalid", + "DenomCreationFee and FeeCollectorAddr must be both set or both unset", + }, + { + "fee_collector_address empty denom_creation_fee", + types.MsgUpdateParams{ + Authority: testutil.TestOwnerAddress, + Params: types.Params{ + FeeCollectorAddress: testAddress, + }, + }, + "DenomCreationFee and FeeCollectorAddr must be both set or both unset", }, { "invalid fee_collector_address", types.MsgUpdateParams{ Authority: testutil.TestOwnerAddress, Params: types.Params{ + DenomCreationFee: sdktypes.NewCoins(sdktypes.NewCoin("untrn", math.OneInt())), FeeCollectorAddress: "invalid fee_collector_address", }, }, - "fee_collector_address is invalid", + "failed to validate FeeCollectorAddress", }, } diff --git a/x/tokenfactory/types/tx.go b/x/tokenfactory/types/tx.go index 8b908d852..3925b0b5a 100644 --- a/x/tokenfactory/types/tx.go +++ b/x/tokenfactory/types/tx.go @@ -32,11 +32,5 @@ func (msg *MsgUpdateParams) Validate() error { return errorsmod.Wrap(err, "authority is invalid") } - // TODO: This is inconsistent. Per Params.Validate() an empty creator address is valid as long as - // DenomCreationFee is nil. But This check fails if FeeCollectorAddress is unset. - if _, err := sdk.AccAddressFromBech32(msg.Params.FeeCollectorAddress); err != nil { - return errorsmod.Wrap(err, "fee_collector_address is invalid") - } - return msg.Params.Validate() } From 2083c192ea0c4bdf59ff2658d9b4276248e6ee9c Mon Sep 17 00:00:00 2001 From: Julian Compagni Portis Date: Tue, 2 Jul 2024 13:13:15 -0400 Subject: [PATCH 86/87] Add test for successfully setting WhitelistedHooks --- testutil/tokenfactory/keeper/tokenfactory.go | 3 +- x/tokenfactory/keeper/msg_server_test.go | 67 ++++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/testutil/tokenfactory/keeper/tokenfactory.go b/testutil/tokenfactory/keeper/tokenfactory.go index 55bbabced..d122324c1 100644 --- a/testutil/tokenfactory/keeper/tokenfactory.go +++ b/testutil/tokenfactory/keeper/tokenfactory.go @@ -14,6 +14,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" + "github.com/neutron-org/neutron/v4/testutil" "github.com/neutron-org/neutron/v4/x/tokenfactory/keeper" "github.com/neutron-org/neutron/v4/x/tokenfactory/types" ) @@ -43,7 +44,7 @@ func TokenFactoryKeeper( accountKeeper, bankKeeper, contractKeeper, - "authority", + testutil.TestOwnerAddress, ) ctx := sdk.NewContext(stateStore, tmproto.Header{}, false, log.NewNopLogger()) diff --git a/x/tokenfactory/keeper/msg_server_test.go b/x/tokenfactory/keeper/msg_server_test.go index fd51c7a4f..30edda04c 100644 --- a/x/tokenfactory/keeper/msg_server_test.go +++ b/x/tokenfactory/keeper/msg_server_test.go @@ -911,3 +911,70 @@ func TestMsgUpdateParamsValidate(t *testing.T) { }) } } + +func TestMsgUpdateParamsWhitelistedHooks(t *testing.T) { + k, ctx := testkeeper.TokenFactoryKeeper(t, nil, nil, nil) + + tests := []struct { + name string + params types.Params + error string + }{ + { + "success", + types.Params{ + WhitelistedHooks: []*types.WhitelistedHook{{DenomCreator: testAddress, CodeID: 1}}, + }, + "", + }, + { + "success multiple ", + types.Params{ + WhitelistedHooks: []*types.WhitelistedHook{ + {DenomCreator: testAddress, CodeID: 1}, + {DenomCreator: testAddress, CodeID: 2}, + }, + }, + "", + }, + { + "invalid denom creator", + types.Params{ + WhitelistedHooks: []*types.WhitelistedHook{ + {DenomCreator: "bad_address", CodeID: 1}, + }, + }, + "invalid denom creator", + }, + { + "duplicate hooks", + types.Params{ + WhitelistedHooks: []*types.WhitelistedHook{ + {DenomCreator: testAddress, CodeID: 1}, + {DenomCreator: testAddress, CodeID: 1}, + }, + }, + "duplicate whitelisted hook", + }, + } + + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + msg := &types.MsgUpdateParams{ + Authority: testutil.TestOwnerAddress, + Params: tt.params, + } + resp, err := k.UpdateParams(ctx, msg) + if len(tt.error) > 0 { + require.ErrorContains(t, err, tt.error) + require.Nil(t, resp) + + } else { + require.NoError(t, err) + newParams := k.GetParams(ctx) + require.Equal(t, tt.params, newParams) + } + }) + } +} From eded62245f1ca94bfe815bef0e5fcb5d28af5089 Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Thu, 4 Jul 2024 15:42:51 +0300 Subject: [PATCH 87/87] upd chain manager contract --- contracts/neutron_chain_manager.wasm | Bin 474462 -> 558660 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/contracts/neutron_chain_manager.wasm b/contracts/neutron_chain_manager.wasm index e136f67ec178f1446d03ab5edb367ead997aa705..9127898467342809c29c3696c3b1c5502c883abd 100644 GIT binary patch literal 558660 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

_3C8*ng}FycPceG4wG{it=vhliz0ZujXI=6H73 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