Repository: osmosis-labs/osmosis
Pull request #4676 (2023-03-20 09:52:36)

Flag for saving environent
<!-- < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < ☺
v                               ✰  Thanks for creating a PR! ✰    
v    Before smashing the submit button please review the checkboxes.
v    If a checkbox is n/a - please still include it but + a little note why
v    If your PR doesn't close an issue, that's OK!  Just remove the Closes: #XXX line!
☺ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >  -->

Closes: #4654 

## What is the purpose of the change

Refer from [cmt](https://github.com/osmosis-labs/osmosis/issues/4654#issue-1629502654).

One limitation of using environment variable is that we have to save to `.omsosisd`. This can cause trouble for users who don't want to use this feature.

So I added a bool flag `init-env` to `InitCmd` to determine if the user wants to use the current directory as environment variable. If not, `home` flag is used normally and no `.env` file is created. Then it is possible for users to set environment variables with the `set-env` command


## Brief Changelog

*(for example:)*
 
  - *The metadata is stored in the blob store on job creation time as a persistent artifact*
  - *Deployments RPC transmits only the blob storage reference*
  - *Daemons retrieve the RPC data from the blob cache*


## Testing and Verifying

*(Please pick one of the following options)*

This change is a trivial rework / code cleanup without any test coverage.

*(or)*

This change is already covered by existing tests, such as *(please describe tests)*.

*(or)*

This change added tests and can be verified as follows:

*(example:)*
  - *Added unit test that validates ...*
  - *Added integration tests for end-to-end deployment with ...*
  - *Extended integration test for ...*
  - *Manually verified the change by ...*

## Documentation and Release Note

  - Does this pull request introduce a new feature or user-facing behavior changes? (yes / no)
  - Is a relevant changelog entry added to the `Unreleased` section in `CHANGELOG.md`? (yes / no)
  - How is the feature or change documented? (not applicable   /   specification (`x/<module>/spec/`)  /  [Osmosis docs repo](https://github.com/osmosis-labs/docs)   /   not documented)

github-actions[bot]: This pull request has been automatically marked as stale because it has not had any recent activity. It will be closed if no further activity occurs. Thank you!

Patch:
diff --git a/.dockerignore b/.dockerignore
index 14ef7bb17..2ddc8efa6 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -5,7 +5,7 @@ networks/
 proto/
 scripts/
 tools/
-tests/cl-go-client
+tests/
 .github/
 .git/
 .vscode/
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
new file mode 100644
index 000000000..c166f17f3
--- /dev/null
+++ b/.github/CODEOWNERS
@@ -0,0 +1,23 @@
+app/wasm/**/* @nicolaslara @czarcas7ic
+x/concentrated-liquidity/ @czarcas7ic @p0mvn
+x/downtime-detector/ @nicolaslara
+x/epochs/ @mattverse @nicolaslara
+x/gamm/ @mattverse @czarcas7ic @p0mvn
+x/incentives/ @mattverse @p0mvn
+x/lockup/ @mattverse @stackman27 @czarcas7ic
+x/mint/ @p0mvn
+x/pool-incentives/ @czarcas7ic @p0mvn
+x/poolmanager/ @czarcas7ic @p0mvn @mattverse
+x/protorev/ @p0mvn
+x/superfluid/ @mattverse @stackman27
+x/tokenfactory/ @mattverse @nicolaslara @p0mvn
+x/twap/ @nicolaslara @p0mvn
+x/txfees/ @nicolaslara @p0mvn
+x/valset-pref/ @mattverse @stackman27
+
+/.github/ @osmosis-labs/devops
+Dockerfile @osmosis-labs/devops
+.dockerignore @osmosis-labs/devops
+Makefile @osmosis-labs/devops
+/tests/localosmosis/ @osmosis-labs/devops
+/tests/localrelayer/ @osmosis-labs/devops
\ No newline at end of file
diff --git a/.github/workflows/push-dev-docker-images.yml b/.github/workflows/push-dev-docker-images.yml
index b7a262458..4211f62c2 100644
--- a/.github/workflows/push-dev-docker-images.yml
+++ b/.github/workflows/push-dev-docker-images.yml
@@ -23,7 +23,7 @@ on:
     - v[0-9]+.x
   
 env:
-  RUNNER_BASE_IMAGE_ALPINE: alpine:3.16
+  RUNNER_BASE_IMAGE_ALPINE: alpine:3.17
   OSMOSIS_DEV_IMAGE_REPOSITORY: osmolabs/osmosis-dev
   OSMOSIS_INIT_CHAIN_IMAGE_REPOSITORY: osmolabs/osmosis-e2e-init-chain
 
diff --git a/.github/workflows/push-docker-images.yml b/.github/workflows/push-docker-images.yml
index f36515418..acd6705c9 100644
--- a/.github/workflows/push-docker-images.yml
+++ b/.github/workflows/push-docker-images.yml
@@ -17,7 +17,7 @@
 # - `osmolabs/osmosis:X.Y.Z`             uses `gcr.io/distroless/static-debian11`
 # - `osmolabs/osmosis:X.Y.Z-distroless`  uses `gcr.io/distroless/static-debian11`
 # - `osmolabs/osmosis:X.Y.Z-nonroot`     uses `gcr.io/distroless/static-debian11:nonroot`
-# - `osmolabs/osmosis:X.Y.Z-alpine`      uses `alpine:3.16` 
+# - `osmolabs/osmosis:X.Y.Z-alpine`      uses `alpine:3.17` 
 #
 # All the images above have support for linux/amd64 and linux/arm64.
 #
@@ -35,7 +35,7 @@ env:
   DOCKER_REPOSITORY: osmolabs/osmosis
   RUNNER_BASE_IMAGE_DISTROLESS: gcr.io/distroless/static-debian11
   RUNNER_BASE_IMAGE_NONROOT: gcr.io/distroless/static-debian11:nonroot
-  RUNNER_BASE_IMAGE_ALPINE: alpine:3.16
+  RUNNER_BASE_IMAGE_ALPINE: alpine:3.17
 
 jobs:
   osmosisd-images:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index fa6001fa3..8d15493e8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -52,6 +52,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
   * [#4582](https://github.com/osmosis-labs/osmosis/pull/4582) Consistently generate build tags metadata, to return a comma-separated list without stray quotes. This affects the output from `version` CLI subcommand and server info API calls.
   * [#4549](https://github.com/osmosis-labs/osmosis/pull/4549) Add single pool price estimate queries
   * [#4767](https://github.com/osmosis-labs/osmosis/pull/4767) Disable create pool with non-zero exit fee
+  * [#4847](https://github.com/osmosis-labs/osmosis/pull/4847) Update `make build` command to build only `osmosisd` binary
+  * [#4893](https://github.com/osmosis-labs/osmosis/pull/4893) Update alpine docker base image to `alpine:3.17`
 
 ### API Breaks
 
@@ -61,6 +63,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 * [#4658](https://github.com/osmosis-labs/osmosis/pull/4658) Deprecate x/gamm Pool query. The new one is located in x/poolmanager.
 * [#4682](https://github.com/osmosis-labs/osmosis/pull/4682) Deprecate x/gamm SpotPrice v2 query. The new one is located in x/poolmanager.
 * [#4801](https://github.com/osmosis-labs/osmosis/pull/4801) remove GetTotalShares, GetTotalLiquidity and GetExitFee from PoolI. Define all on CFMMPoolI, define GetTotalLiquidity on PoolModuleI only.
+* [#4868](https://github.com/osmosis-labs/osmosis/pull/4868) Remove wasmEnabledProposals []wasm.ProposalType from NewOsmosisApp
 
 
 ## v15.0.0
diff --git a/Makefile b/Makefile
index c6eb55cc4..0d2eb48e9 100644
--- a/Makefile
+++ b/Makefile
@@ -5,8 +5,9 @@ COMMIT := $(shell git log -1 --format='%H')
 LEDGER_ENABLED ?= true
 SDK_PACK := $(shell go list -m github.com/cosmos/cosmos-sdk | sed  's/ /\@/g')
 GO_VERSION := $(shell cat go.mod | grep -E 'go [0-9].[0-9]+' | cut -d ' ' -f 2)
-DOCKER := $(shell which docker)
+GO_MODULE := $(shell cat go.mod | grep module | cut -d ' ' -f 2)
 BUILDDIR ?= $(CURDIR)/build
+DOCKER := $(shell which docker)
 E2E_UPGRADE_VERSION := "v16"
 
 
@@ -94,14 +95,16 @@ endif
 
 all: install lint test
 
-BUILD_TARGETS := build install
-
-build: BUILD_ARGS=-o $(BUILDDIR)/
+build: check_version go.sum
+	mkdir -p $(BUILDDIR)/
+	GOWORK=off go build -mod=readonly  $(BUILD_FLAGS) -o $(BUILDDIR)/ $(GO_MODULE)/cmd/osmosisd
 
-$(BUILD_TARGETS): check_version go.sum $(BUILDDIR)/
-	GOWORK=off go $@ -mod=readonly $(BUILD_FLAGS) $(BUILD_ARGS) ./...
-$(BUILDDIR)/:
+build-all: check_version go.sum
 	mkdir -p $(BUILDDIR)/
+	GOWORK=off go build -mod=readonly $(BUILD_FLAGS) -o $(BUILDDIR)/ ./...
+
+install: check_version go.sum
+	GOWORK=off go install -mod=readonly $(BUILD_FLAGS) $(GO_MODULE)/cmd/osmosisd
 
 # Cross-building for arm64 from amd64 (or viceversa) takes
 # a lot of time due to QEMU virtualization but it's the only way (afaik)
@@ -116,7 +119,7 @@ build-reproducible-amd64: go.sum $(BUILDDIR)/
 		--build-arg GO_VERSION=$(GO_VERSION) \
 		--build-arg GIT_VERSION=$(VERSION) \
 		--build-arg GIT_COMMIT=$(COMMIT) \
-		--build-arg RUNNER_IMAGE=alpine:3.16 \
+		--build-arg RUNNER_IMAGE=alpine:3.17 \
 		--platform linux/amd64 \
 		-t osmosis:local-amd64 \
 		--load \
@@ -133,7 +136,7 @@ build-reproducible-arm64: go.sum $(BUILDDIR)/
 		--build-arg GO_VERSION=$(GO_VERSION) \
 		--build-arg GIT_VERSION=$(VERSION) \
 		--build-arg GIT_COMMIT=$(COMMIT) \
-		--build-arg RUNNER_IMAGE=alpine:3.16 \
+		--build-arg RUNNER_IMAGE=alpine:3.17 \
 		--platform linux/arm64 \
 		-t osmosis:local-arm64 \
 		--load \
@@ -328,7 +331,7 @@ e2e-remove-resources:
 ###############################################################################
 
 RUNNER_BASE_IMAGE_DISTROLESS := gcr.io/distroless/static-debian11
-RUNNER_BASE_IMAGE_ALPINE := alpine:3.16
+RUNNER_BASE_IMAGE_ALPINE := alpine:3.17
 RUNNER_BASE_IMAGE_NONROOT := gcr.io/distroless/static-debian11:nonroot
 
 docker-build:
diff --git a/app/app.go b/app/app.go
index 8fdffc39a..ad6b94aa4 100644
--- a/app/app.go
+++ b/app/app.go
@@ -179,7 +179,6 @@ func NewOsmosisApp(
 	homePath string,
 	invCheckPeriod uint,
 	appOpts servertypes.AppOptions,
-	wasmEnabledProposals []wasm.ProposalType,
 	wasmOpts []wasm.Option,
 	baseAppOptions ...func(*baseapp.BaseApp),
 ) *OsmosisApp {
@@ -189,6 +188,7 @@ func NewOsmosisApp(
 	appCodec := encodingConfig.Marshaler
 	cdc := encodingConfig.Amino
 	interfaceRegistry := encodingConfig.InterfaceRegistry
+	wasmEnabledProposals := GetWasmEnabledProposals()
 
 	bApp := baseapp.NewBaseApp(appName, logger, db, encodingConfig.TxConfig.TxDecoder(), baseAppOptions...)
 	bApp.SetCommitMultiStoreTracer(traceStore)
diff --git a/app/config.go b/app/config.go
index 6d271c9b8..052f2e762 100644
--- a/app/config.go
+++ b/app/config.go
@@ -52,7 +52,6 @@ func NewAppConstructor() network.AppConstructor {
 		return NewOsmosisApp(
 			val.Ctx.Logger, dbm.NewMemDB(), nil, true, make(map[int64]bool), val.Ctx.Config.RootDir, 0,
 			simapp.EmptyAppOptions{},
-			GetWasmEnabledProposals(),
 			EmptyWasmOpts,
 			baseapp.SetMinGasPrices(val.AppConfig.MinGasPrices),
 		)
diff --git a/app/keepers/keepers.go b/app/keepers/keepers.go
index dcb6c8142..fc6e6e1d5 100644
--- a/app/keepers/keepers.go
+++ b/app/keepers/keepers.go
@@ -296,10 +296,17 @@ func (appKeepers *AppKeepers) InitNormalKeepers(
 		appKeepers.SlashingKeeper,
 	)
 
+	appKeepers.LockupKeeper = lockupkeeper.NewKeeper(
+		appKeepers.keys[lockuptypes.StoreKey],
+		appKeepers.AccountKeeper,
+		appKeepers.BankKeeper,
+		appKeepers.DistrKeeper, appKeepers.GetSubspace(lockuptypes.ModuleName))
+
 	appKeepers.ConcentratedLiquidityKeeper = concentratedliquidity.NewKeeper(
 		appCodec,
 		appKeepers.keys[concentratedliquiditytypes.StoreKey],
 		appKeepers.BankKeeper,
+		appKeepers.LockupKeeper,
 		appKeepers.GetSubspace(concentratedliquiditytypes.ModuleName),
 	)
 
@@ -329,13 +336,6 @@ func (appKeepers *AppKeepers) InitNormalKeepers(
 		appKeepers.GetSubspace(twaptypes.ModuleName),
 		appKeepers.PoolManagerKeeper)
 
-	appKeepers.LockupKeeper = lockupkeeper.NewKeeper(
-		appKeepers.keys[lockuptypes.StoreKey],
-		// TODO: Visit why this needs to be deref'd
-		*appKeepers.AccountKeeper,
-		appKeepers.BankKeeper,
-		appKeepers.DistrKeeper, appKeepers.GetSubspace(lockuptypes.ModuleName))
-
 	appKeepers.EpochsKeeper = epochskeeper.NewKeeper(appKeepers.keys[epochstypes.StoreKey])
 
 	protorevKeeper := protorevkeeper.NewKeeper(
diff --git a/chain.schema.json b/chain.schema.json
index 029cd2715..dfa5a9739 100644
--- a/chain.schema.json
+++ b/chain.schema.json
@@ -83,7 +83,26 @@
       {
         "name": "v15",
         "tag" : "v15.0.0",
-        "height": 8732500
+        "height": 8732500,
+        "recommended_version": "v15.0.0",
+        "compatible_versions": [
+          "v15.0.0"
+        ],
+        "cosmos_sdk_version": "0.45",
+        "consensus": {
+          "type": "tendermint",
+          "version": "0.34"
+        },
+        "cosmwasm_version": "0.30",
+        "cosmwasm_enabled": true,
+        "ibc_go_version": "4.3.0",
+        "ics_enabled": [
+          "ics20-1"
+        ],
+        "binaries": {
+          "linux/amd64": "https://github.com/osmosis-labs/osmosis/releases/download/v15.0.0/osmosisd-15.0.0-linux-amd64?checksum=sha256:6f5cead57c16c1e708df2a0f336e6e4494a026ba97b8d8afef95e5fc5b80b465",
+          "linux/arm64": "https://github.com/osmosis-labs/osmosis/releases/download/v15.0.0/osmosisd-15.0.0-linux-arm64?checksum=sha256:94aee34e288148b155a2b0fdfe268a0bdc0d4a90de6db8f8a9cee74c2e829294"
+        }
       }
     ]
   }
diff --git a/cmd/osmosisd/cmd/init.go b/cmd/osmosisd/cmd/init.go
index f61ce528e..b7a6b2c19 100644
--- a/cmd/osmosisd/cmd/init.go
+++ b/cmd/osmosisd/cmd/init.go
@@ -36,6 +36,9 @@ const (
 
 	// FlagSeed defines a flag to initialize the private validator key from a specific seed.
 	FlagRecover = "recover"
+
+	// FlagSetEnv defines a flag to create environment file & save current home directory into it.
+	FlagSetEnv = "set-env"
 )
 
 type printInfo struct {
@@ -169,9 +172,12 @@ func InitCmd(mbm module.BasicManager, defaultNodeHome string) *cobra.Command {
 
 			tmcfg.WriteConfigFile(filepath.Join(config.RootDir, "config", "config.toml"), config)
 
-			err = CreateEnvFile(cmd)
-			if err != nil {
-				return errors.Wrapf(err, "Failed to create environment file")
+			createEnv, _ := cmd.Flags().GetBool(FlagSetEnv)
+			if createEnv {
+				err = CreateEnvFile(cmd)
+				if err != nil {
+					return errors.Wrapf(err, "Failed to create environment file")
+				}
 			}
 			return displayInfo(toPrint)
 		},
@@ -181,6 +187,7 @@ func InitCmd(mbm module.BasicManager, defaultNodeHome string) *cobra.Command {
 	cmd.Flags().BoolP(FlagOverwrite, "o", false, "overwrite the genesis.json file")
 	cmd.Flags().Bool(FlagRecover, false, "provide seed phrase to recover existing key instead of creating")
 	cmd.Flags().String(flags.FlagChainID, "", "genesis file chain-id, if left blank will be randomly created")
+	cmd.Flags().Bool(FlagSetEnv, false, "set and save current directory as home directory")
 
 	return cmd
 }
diff --git a/cmd/osmosisd/cmd/root.go b/cmd/osmosisd/cmd/root.go
index 8c8415a29..dbfcd8b1d 100644
--- a/cmd/osmosisd/cmd/root.go
+++ b/cmd/osmosisd/cmd/root.go
@@ -295,7 +295,6 @@ func newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, appOpts serverty
 		cast.ToString(appOpts.Get(flags.FlagHome)),
 		cast.ToUint(appOpts.Get(server.FlagInvCheckPeriod)),
 		appOpts,
-		osmosis.GetWasmEnabledProposals(),
 		wasmOpts,
 		baseapp.SetPruning(pruningOpts),
 		baseapp.SetMinGasPrices(cast.ToString(appOpts.Get(server.FlagMinGasPrices))),
@@ -319,7 +318,7 @@ func createOsmosisAppAndExport(
 	encCfg.Marshaler = codec.NewProtoCodec(encCfg.InterfaceRegistry)
 	loadLatest := height == -1
 	homeDir := cast.ToString(appOpts.Get(flags.FlagHome))
-	app := osmosis.NewOsmosisApp(logger, db, traceStore, loadLatest, map[int64]bool{}, homeDir, 0, appOpts, osmosis.GetWasmEnabledProposals(), osmosis.EmptyWasmOpts)
+	app := osmosis.NewOsmosisApp(logger, db, traceStore, loadLatest, map[int64]bool{}, homeDir, 0, appOpts, osmosis.EmptyWasmOpts)
 
 	if !loadLatest {
 		if err := app.LoadHeight(height); err != nil {
diff --git a/go.mod b/go.mod
index 7a41681d4..dbe84b0e9 100644
--- a/go.mod
+++ b/go.mod
@@ -25,7 +25,7 @@ require (
 	github.com/pkg/errors v0.9.1
 	github.com/rakyll/statik v0.1.7
 	github.com/spf13/cast v1.5.0
-	github.com/spf13/cobra v1.6.1
+	github.com/spf13/cobra v1.7.0
 	github.com/spf13/pflag v1.0.5
 	github.com/spf13/viper v1.15.0
 	github.com/strangelove-ventures/async-icq/v4 v4.0.0-rc0
@@ -40,7 +40,7 @@ require (
 	google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa
 	google.golang.org/grpc v1.53.0
 	gopkg.in/yaml.v2 v2.4.0
-	mvdan.cc/gofumpt v0.4.0
+	mvdan.cc/gofumpt v0.5.0
 )
 
 require (
@@ -190,7 +190,7 @@ require (
 	github.com/hexops/gotextdiff v1.0.3 // indirect
 	github.com/imdario/mergo v0.3.13 // indirect
 	github.com/improbable-eng/grpc-web v0.15.0 // indirect
-	github.com/inconshreveable/mousetrap v1.0.1 // indirect
+	github.com/inconshreveable/mousetrap v1.1.0 // indirect
 	github.com/jessevdk/go-flags v1.4.0 // indirect
 	github.com/jgautheron/goconst v1.5.1 // indirect
 	github.com/jingyugao/rowserrcheck v1.1.1 // indirect
@@ -292,13 +292,13 @@ require (
 	go.opencensus.io v0.24.0 // indirect
 	golang.org/x/crypto v0.5.0 // indirect
 	golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2 // indirect
-	golang.org/x/mod v0.9.0 // indirect
-	golang.org/x/net v0.8.0 // indirect
+	golang.org/x/mod v0.10.0 // indirect
+	golang.org/x/net v0.9.0 // indirect
 	golang.org/x/sync v0.1.0 // indirect
-	golang.org/x/sys v0.6.0 // indirect
-	golang.org/x/term v0.6.0 // indirect
-	golang.org/x/text v0.8.0 // indirect
-	golang.org/x/tools v0.7.0 // indirect
+	golang.org/x/sys v0.7.0 // indirect
+	golang.org/x/term v0.7.0 // indirect
+	golang.org/x/text v0.9.0 // indirect
+	golang.org/x/tools v0.8.0 // indirect
 	google.golang.org/protobuf v1.28.2-0.20220831092852-f930b1dc76e8 // indirect
 	gopkg.in/ini.v1 v1.67.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1
diff --git a/go.sum b/go.sum
index f17d6c7de..ff1bf9f97 100644
--- a/go.sum
+++ b/go.sum
@@ -356,7 +356,7 @@ github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8
 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.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
-github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE=
+github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
 github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
@@ -661,8 +661,8 @@ github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK
 github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ=
 github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
-github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc=
-github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
+github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
+github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
 github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY=
 github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI=
 github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8=
@@ -934,10 +934,6 @@ github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3 h1:Ylmch
 github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3/go.mod h1:lV6KnqXYD/ayTe7310MHtM3I2q8Z6bBfMAi+bhwPYtI=
 github.com/osmosis-labs/osmosis/osmomath v0.0.3-dev.0.20230328024000-175ec88e4304 h1:iSSlHl+SoewNpP/2N8JaUEHhOQRmJAnS8zaJ11yWslY=
 github.com/osmosis-labs/osmosis/osmomath v0.0.3-dev.0.20230328024000-175ec88e4304/go.mod h1:/h3CZIo25kMrM4Ojm7qBgMxKofTVwOycVWSa4rhEsaM=
-github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230405034006-93aa0f949cfd h1:4elACSE81lw0dqKUa0b6lhqtARbaYQmzRwxXHpphWIY=
-github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230405034006-93aa0f949cfd/go.mod h1:zyBrzl2rsZWGbOU+/1hzA+xoQlCshzZuHe/5mzdb/zo=
-github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230405163559-8a20ce56033e h1:OxJ9KdCI7QsOwZmKcQXzAklYcb6HcXRS4KgjHaZBY3k=
-github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230405163559-8a20ce56033e/go.mod h1:zyBrzl2rsZWGbOU+/1hzA+xoQlCshzZuHe/5mzdb/zo=
 github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230405221332-6db5383670e1 h1:oq28hQA8wHe1uNMHWsoSMJvxMkKQrIeg8PcQD1KkHYg=
 github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230405221332-6db5383670e1/go.mod h1:zyBrzl2rsZWGbOU+/1hzA+xoQlCshzZuHe/5mzdb/zo=
 github.com/osmosis-labs/osmosis/x/epochs v0.0.0-20230328024000-175ec88e4304 h1:RIrWLzIiZN5Xd2JOfSOtGZaf6V3qEQYg6EaDTAkMnCo=
@@ -970,7 +966,6 @@ github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG
 github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
 github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
 github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
-github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A=
 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=
@@ -1049,7 +1044,7 @@ github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRr
 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 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
+github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
 github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
 github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U=
 github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU=
@@ -1119,8 +1114,8 @@ github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w=
 github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU=
 github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
-github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA=
-github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY=
+github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I=
+github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0=
 github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
 github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
 github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
@@ -1375,8 +1370,8 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91
 golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI=
 golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
-golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs=
-golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk=
+golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -1436,8 +1431,8 @@ golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
 golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
 golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws=
 golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
-golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
-golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
+golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
+golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
 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=
@@ -1559,8 +1554,8 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.4.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 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
-golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
+golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -1569,8 +1564,8 @@ golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
 golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA=
 golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ=
 golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
-golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw=
-golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
+golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ=
+golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
 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=
@@ -1584,8 +1579,8 @@ golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=
-golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
+golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
 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=
@@ -1673,8 +1668,8 @@ golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k=
 golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ=
 golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k=
 golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4=
-golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s=
+golang.org/x/tools v0.8.0 h1:vSDcovVPld282ceKgDimkRSC8kpaH1dgyc9UMzlt84Y=
+golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4=
 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=
@@ -1824,8 +1819,8 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9
 honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=
 honnef.co/go/tools v0.4.3 h1:o/n5/K5gXqk8Gozvs2cnL0F2S1/g1vcGCAx2vETjITw=
 honnef.co/go/tools v0.4.3/go.mod h1:36ZgoUOrqOk1GxwHhyryEkq8FQWkUO2xGuSMhUCcdvA=
-mvdan.cc/gofumpt v0.4.0 h1:JVf4NN1mIpHogBj7ABpgOyZc65/UUOkKQFkoURsz4MM=
-mvdan.cc/gofumpt v0.4.0/go.mod h1:PljLOHDeZqgS8opHRKLzp2It2VBuSdteAgqUfzMTxlQ=
+mvdan.cc/gofumpt v0.5.0 h1:0EQ+Z56k8tXjj/6TQD25BFNKQXpCvT0rnansIc7Ug5E=
+mvdan.cc/gofumpt v0.5.0/go.mod h1:HBeVDtMKRZpXyxFciAirzdKklDlGu8aAy1wEbH5Y9js=
 mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I=
 mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc=
 mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo=
diff --git a/networks/osmosis-1/upgrades/v13/mainnet/guide.md b/networks/osmosis-1/upgrades/v13/mainnet/guide.md
index d6857123e..b5f727001 100644
--- a/networks/osmosis-1/upgrades/v13/mainnet/guide.md
+++ b/networks/osmosis-1/upgrades/v13/mainnet/guide.md
@@ -4,7 +4,7 @@ Osmosis v13 Gov Prop: <https://www.mintscan.io/osmosis/proposals/370>
 
 Countdown: <https://www.mintscan.io/osmosis/blocks/7241500>
 
-Height: 6246000 TODO: Update upgrade height
+Height: 7241500
 
 ## Memory Requirements
 
diff --git a/proto/osmosis/concentrated-liquidity/pool-model/query.proto b/proto/osmosis/concentrated-liquidity/pool-model/query.proto
index 6093145bd..2ff32c4c3 100644
--- a/proto/osmosis/concentrated-liquidity/pool-model/query.proto
+++ b/proto/osmosis/concentrated-liquidity/pool-model/query.proto
@@ -143,16 +143,10 @@ message LiquidityDepthWithRange {
 message QueryLiquidityNetInDirectionRequest {
   uint64 pool_id = 1 [ (gogoproto.moretags) = "yaml:\"pool_id\"" ];
   string token_in = 2 [ (gogoproto.moretags) = "yaml:\"token_in\"" ];
-  string start_tick = 3 [
-    (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int",
-    (gogoproto.moretags) = "yaml:\"start_tick\"",
-    (gogoproto.nullable) = true
-  ];
-  string bound_tick = 4 [
-    (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int",
-    (gogoproto.moretags) = "yaml:\"bound_tick\"",
-    (gogoproto.nullable) = true
-  ];
+  int64 start_tick = 3 [ (gogoproto.moretags) = "yaml:\"start_tick\"" ];
+  bool use_cur_tick = 4 [ (gogoproto.moretags) = "yaml:\"use_cur_tick\"" ];
+  int64 bound_tick = 5 [ (gogoproto.moretags) = "yaml:\"bound_tick\"" ];
+  bool use_no_bound = 6 [ (gogoproto.moretags) = "yaml:\"use_no_bound\"" ];
 }
 message QueryLiquidityNetInDirectionResponse {
   repeated TickLiquidityNet liquidity_depths = 1
diff --git a/x/concentrated-liquidity/export_internal.go b/x/concentrated-liquidity/export_internal.go
new file mode 100644
index 000000000..1ff4bf136
--- /dev/null
+++ b/x/concentrated-liquidity/export_internal.go
@@ -0,0 +1,11 @@
+package concentrated_liquidity
+
+import (
+	sdk "github.com/cosmos/cosmos-sdk/types"
+
+	"github.com/osmosis-labs/osmosis/v15/x/concentrated-liquidity/internal/math"
+)
+
+func TickToSqrtPrice(tickIndex, exponentAtPriceOne sdk.Int) (price sdk.Dec, err error) {
+	return math.TickToSqrtPrice(tickIndex, exponentAtPriceOne)
+}
diff --git a/x/concentrated-liquidity/grpc_query.go b/x/concentrated-liquidity/grpc_query.go
index d93fd9558..91978ed98 100644
--- a/x/concentrated-liquidity/grpc_query.go
+++ b/x/concentrated-liquidity/grpc_query.go
@@ -182,16 +182,19 @@ func (q Querier) LiquidityNetInDirection(goCtx context.Context, req *clquery.Que
 	}
 	ctx := sdk.UnwrapSDKContext(goCtx)
 
-	initTick := func(tick *sdk.Int) sdk.Int {
-		if tick == nil {
-			return sdk.Int{}
-		}
-		return *tick
+	if req.TokenIn == "" {
+		return nil, status.Error(codes.InvalidArgument, "tokenIn is empty")
+	}
+
+	var startTick sdk.Int
+	if !req.UseCurTick {
+		startTick = sdk.NewInt(req.StartTick)
 	}
 
-	// convert values from pointers
-	startTick := initTick(req.StartTick)
-	boundTick := initTick(req.BoundTick)
+	var boundTick sdk.Int
+	if !req.UseNoBound {
+		boundTick = sdk.NewInt(req.BoundTick)
+	}
 
 	liquidityDepths, err := q.Keeper.GetTickLiquidityNetInDirection(
 		ctx,
@@ -209,7 +212,7 @@ func (q Querier) LiquidityNetInDirection(goCtx context.Context, req *clquery.Que
 		return nil, err
 	}
 
-	return &clquery.QueryLiquidityNetInDirectionResponse{LiquidityDepths: liquidityDepths, CurrentLiquidity: pool.GetLiquidity()}, nil
+	return &clquery.QueryLiquidityNetInDirectionResponse{LiquidityDepths: liquidityDepths, CurrentLiquidity: pool.GetLiquidity(), CurrentTick: pool.GetCurrentTick().Int64()}, nil
 }
 
 func (q Querier) ClaimableFees(ctx context.Context, req *clquery.QueryClaimableFeesRequest) (*clquery.QueryClaimableFeesResponse, error) {
diff --git a/x/concentrated-liquidity/keeper.go b/x/concentrated-liquidity/keeper.go
index 7798976de..40ae0f747 100644
--- a/x/concentrated-liquidity/keeper.go
+++ b/x/concentrated-liquidity/keeper.go
@@ -21,18 +21,20 @@ type Keeper struct {
 	// keepers
 	poolmanagerKeeper types.PoolManagerKeeper
 	bankKeeper        types.BankKeeper
+	lockupKeeper      types.LockupKeeper
 }
 
-func NewKeeper(cdc codec.BinaryCodec, storeKey sdk.StoreKey, bankKeeper types.BankKeeper, paramSpace paramtypes.Subspace) *Keeper {
+func NewKeeper(cdc codec.BinaryCodec, storeKey sdk.StoreKey, bankKeeper types.BankKeeper, lockupKeeper types.LockupKeeper, paramSpace paramtypes.Subspace) *Keeper {
 	// ParamSubspace must be initialized within app/keepers/keepers.go
 	if !paramSpace.HasKeyTable() {
 		paramSpace = paramSpace.WithKeyTable(types.ParamKeyTable())
 	}
 	return &Keeper{
-		storeKey:   storeKey,
-		paramSpace: paramSpace,
-		cdc:        cdc,
-		bankKeeper: bankKeeper,
+		storeKey:     storeKey,
+		paramSpace:   paramSpace,
+		cdc:          cdc,
+		bankKeeper:   bankKeeper,
+		lockupKeeper: lockupKeeper,
 	}
 }
 
diff --git a/x/concentrated-liquidity/lp.go b/x/concentrated-liquidity/lp.go
index b1fab3dc2..b84133b35 100644
--- a/x/concentrated-liquidity/lp.go
+++ b/x/concentrated-liquidity/lp.go
@@ -8,6 +8,7 @@ import (
 
 	sdk "github.com/cosmos/cosmos-sdk/types"
 
+	"github.com/osmosis-labs/osmosis/osmomath"
 	"github.com/osmosis-labs/osmosis/v15/x/concentrated-liquidity/internal/math"
 	types "github.com/osmosis-labs/osmosis/v15/x/concentrated-liquidity/types"
 )
@@ -305,15 +306,17 @@ func (k Keeper) initializeInitialPositionForPool(ctx sdk.Context, pool types.Con
 		return types.InitialLiquidityZeroError{Amount0: amount0Desired, Amount1: amount1Desired}
 	}
 
-	// Calculate the spot price and sqrt price from the amount provided
-	initialSpotPrice := amount1Desired.ToDec().Quo(amount0Desired.ToDec())
-	initialSqrtPrice, err := initialSpotPrice.ApproxSqrt()
+	initialSpotPrice := osmomath.BigDecFromSDKDec(amount1Desired.ToDec()).Quo(osmomath.BigDecFromSDKDec((amount0Desired.ToDec())))
+
+	// Calculate the initial tick from the initial spot price
+	initialTick, err := math.PriceToTick(initialSpotPrice.SDKDec(), pool.GetExponentAtPriceOne())
 	if err != nil {
 		return err
 	}
 
-	// Calculate the initial tick from the initial spot price
-	initialTick, err := math.PriceToTick(initialSpotPrice, pool.GetExponentAtPriceOne())
+	// Re-Calculate the spot price from initial tick so that it is aligned with our internal
+	// tick to price conversion.
+	initialSqrtPrice, err := math.TickToSqrtPrice(initialTick, pool.GetExponentAtPriceOne())
 	if err != nil {
 		return err
 	}
diff --git a/x/concentrated-liquidity/tick.go b/x/concentrated-liquidity/tick.go
index 66e71122a..3f8717f7e 100644
--- a/x/concentrated-liquidity/tick.go
+++ b/x/concentrated-liquidity/tick.go
@@ -1,6 +1,8 @@
 package concentrated_liquidity
 
 import (
+	"fmt"
+
 	"github.com/cosmos/cosmos-sdk/store/prefix"
 	storetypes "github.com/cosmos/cosmos-sdk/store/types"
 	sdk "github.com/cosmos/cosmos-sdk/types"
@@ -304,10 +306,13 @@ func (k Keeper) GetTickLiquidityNetInDirection(ctx sdk.Context, poolId uint64, t
 		return []query.TickLiquidityNet{}, err
 	}
 
+	ctx.Logger().Debug(fmt.Sprintf("userGivenStartTick %s, boundTick %s, currentTick %s\n", userGivenStartTick, boundTick, p.GetCurrentTick()))
+
 	startTick := p.GetCurrentTick()
 	// If start tick is set, use it as the current tick for grabbing liquidities from.
 	if !userGivenStartTick.IsNil() {
 		startTick = userGivenStartTick
+		ctx.Logger().Debug(fmt.Sprintf("startTick %s set to user given\n", startTick))
 	}
 
 	// sanity check that given tokenIn is an asset in pool.
@@ -318,9 +323,15 @@ func (k Keeper) GetTickLiquidityNetInDirection(ctx sdk.Context, poolId uint64, t
 	// figure out zero for one depending on the token in.
 	zeroForOne := p.GetToken0() == tokenIn
 
+	ctx.Logger().Debug(fmt.Sprintf("is_zero_for_one %t\n", zeroForOne))
+
 	// use max or min tick if provided bound is nil
 	exponentAtPriceOne := p.GetExponentAtPriceOne()
 	minTick, maxTick := math.GetMinAndMaxTicksFromExponentAtPriceOneInternal(exponentAtPriceOne)
+
+	ctx.Logger().Debug(fmt.Sprintf("min_tick %d\n", minTick))
+	ctx.Logger().Debug(fmt.Sprintf("max_tick %d\n", maxTick))
+
 	if boundTick.IsNil() {
 		if zeroForOne {
 			boundTick = sdk.NewInt(minTick)
@@ -336,6 +347,7 @@ func (k Keeper) GetTickLiquidityNetInDirection(ctx sdk.Context, poolId uint64, t
 	// between current tick and the min/max tick depending on the swap direction.
 	validateTickIsInValidRange := func(validateTick sdk.Int) error {
 		validateSqrtPrice, err := math.TickToSqrtPrice(validateTick, exponentAtPriceOne)
+		ctx.Logger().Debug(fmt.Sprintf("validateTick %s; validate sqrtPrice %s\n", validateTick.String(), validateSqrtPrice.String()))
 		if err != nil {
 			return err
 		}
@@ -347,10 +359,12 @@ func (k Keeper) GetTickLiquidityNetInDirection(ctx sdk.Context, poolId uint64, t
 		return nil
 	}
 
+	ctx.Logger().Debug("validating bound tick")
 	if err := validateTickIsInValidRange(boundTick); err != nil {
 		return []query.TickLiquidityNet{}, err
 	}
 
+	ctx.Logger().Debug("validating start tick")
 	if err := validateTickIsInValidRange(startTick); err != nil {
 		return []query.TickLiquidityNet{}, err
 	}
diff --git a/x/concentrated-liquidity/types/expected_keepers.go b/x/concentrated-liquidity/types/expected_keepers.go
index 737f47567..c5b00a79a 100644
--- a/x/concentrated-liquidity/types/expected_keepers.go
+++ b/x/concentrated-liquidity/types/expected_keepers.go
@@ -1,9 +1,12 @@
 package types
 
 import (
+	"time"
+
 	sdk "github.com/cosmos/cosmos-sdk/types"
 	banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
 
+	lockuptypes "github.com/osmosis-labs/osmosis/v15/x/lockup/types"
 	poolmanagertypes "github.com/osmosis-labs/osmosis/v15/x/poolmanager/types"
 )
 
@@ -22,3 +25,14 @@ type PoolManagerKeeper interface {
 	CreatePool(ctx sdk.Context, msg poolmanagertypes.CreatePoolMsg) (uint64, error)
 	GetNextPoolId(ctx sdk.Context) uint64
 }
+
+// LockupKeeper defines the expected interface needed to retrieve locks.
+type LockupKeeper interface {
+	GetLockByID(ctx sdk.Context, lockID uint64) (*lockuptypes.PeriodLock, error)
+	// Despite the name, BeginForceUnlock is really BeginUnlock
+	// TODO: Fix this in future code update
+	BeginForceUnlock(ctx sdk.Context, lockID uint64, coins sdk.Coins) (uint64, error)
+	ForceUnlock(ctx sdk.Context, lock lockuptypes.PeriodLock) error
+	CreateLock(ctx sdk.Context, owner sdk.AccAddress, coins sdk.Coins, duration time.Duration) (lockuptypes.PeriodLock, error)
+	SlashTokensFromLockByID(ctx sdk.Context, lockID uint64, coins sdk.Coins) (*lockuptypes.PeriodLock, error)
+}
diff --git a/x/concentrated-liquidity/types/query/query.pb.go b/x/concentrated-liquidity/types/query/query.pb.go
index f3feebddc..7d4f6242a 100644
--- a/x/concentrated-liquidity/types/query/query.pb.go
+++ b/x/concentrated-liquidity/types/query/query.pb.go
@@ -482,10 +482,12 @@ var xxx_messageInfo_LiquidityDepthWithRange proto.InternalMessageInfo
 
 // =============================== LiquidityNetInDirection
 type QueryLiquidityNetInDirectionRequest struct {
-	PoolId    uint64                                  `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty" yaml:"pool_id"`
-	TokenIn   string                                  `protobuf:"bytes,2,opt,name=token_in,json=tokenIn,proto3" json:"token_in,omitempty" yaml:"token_in"`
-	StartTick *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,3,opt,name=start_tick,json=startTick,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"start_tick,omitempty" yaml:"start_tick"`
-	BoundTick *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,4,opt,name=bound_tick,json=boundTick,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"bound_tick,omitempty" yaml:"bound_tick"`
+	PoolId     uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty" yaml:"pool_id"`
+	TokenIn    string `protobuf:"bytes,2,opt,name=token_in,json=tokenIn,proto3" json:"token_in,omitempty" yaml:"token_in"`
+	StartTick  int64  `protobuf:"varint,3,opt,name=start_tick,json=startTick,proto3" json:"start_tick,omitempty" yaml:"start_tick"`
+	UseCurTick bool   `protobuf:"varint,4,opt,name=use_cur_tick,json=useCurTick,proto3" json:"use_cur_tick,omitempty" yaml:"use_cur_tick"`
+	BoundTick  int64  `protobuf:"varint,5,opt,name=bound_tick,json=boundTick,proto3" json:"bound_tick,omitempty" yaml:"bound_tick"`
+	UseNoBound bool   `protobuf:"varint,6,opt,name=use_no_bound,json=useNoBound,proto3" json:"use_no_bound,omitempty" yaml:"use_no_bound"`
 }
 
 func (m *QueryLiquidityNetInDirectionRequest) Reset()         { *m = QueryLiquidityNetInDirectionRequest{} }
@@ -535,6 +537,34 @@ func (m *QueryLiquidityNetInDirectionRequest) GetTokenIn() string {
 	return ""
 }
 
+func (m *QueryLiquidityNetInDirectionRequest) GetStartTick() int64 {
+	if m != nil {
+		return m.StartTick
+	}
+	return 0
+}
+
+func (m *QueryLiquidityNetInDirectionRequest) GetUseCurTick() bool {
+	if m != nil {
+		return m.UseCurTick
+	}
+	return false
+}
+
+func (m *QueryLiquidityNetInDirectionRequest) GetBoundTick() int64 {
+	if m != nil {
+		return m.BoundTick
+	}
+	return 0
+}
+
+func (m *QueryLiquidityNetInDirectionRequest) GetUseNoBound() bool {
+	if m != nil {
+		return m.UseNoBound
+	}
+	return false
+}
+
 type QueryLiquidityNetInDirectionResponse struct {
 	LiquidityDepths  []TickLiquidityNet                     `protobuf:"bytes,1,rep,name=liquidity_depths,json=liquidityDepths,proto3" json:"liquidity_depths"`
 	CurrentTick      int64                                  `protobuf:"varint,2,opt,name=current_tick,json=currentTick,proto3" json:"current_tick,omitempty"`
@@ -790,90 +820,92 @@ func init() {
 }
 
 var fileDescriptor_ce34c1e206115391 = []byte{
-	// 1315 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0xdf, 0x6e, 0x1b, 0xc5,
-	0x17, 0xce, 0xa6, 0x6d, 0x52, 0x8f, 0x93, 0x36, 0x99, 0xe6, 0xd7, 0x5f, 0x62, 0x81, 0x5d, 0x06,
-	0x5a, 0x22, 0x5a, 0xef, 0x2a, 0x81, 0x28, 0x10, 0x51, 0x48, 0x9c, 0x28, 0xad, 0x5b, 0x04, 0x74,
-	0x49, 0x85, 0x54, 0x90, 0x56, 0xfb, 0x67, 0xe2, 0xac, 0xbc, 0x9e, 0x71, 0x76, 0xc7, 0x49, 0x2d,
-	0xd4, 0x1b, 0xb8, 0x02, 0x09, 0x09, 0x09, 0x1e, 0x83, 0x2b, 0x84, 0x78, 0x86, 0xa8, 0x57, 0x91,
-	0x7a, 0x53, 0x21, 0x61, 0xa1, 0x84, 0x27, 0xf0, 0x1d, 0xe2, 0x06, 0xed, 0xec, 0xcc, 0xee, 0x3a,
-	0x71, 0x12, 0x3b, 0x09, 0x57, 0xf1, 0xee, 0x9c, 0xf3, 0x9d, 0xef, 0x3b, 0xe7, 0xcc, 0x99, 0xd9,
-	0x80, 0x39, 0x1a, 0xd4, 0x68, 0xe0, 0x06, 0x9a, 0x4d, 0x89, 0x8d, 0x09, 0xf3, 0x4d, 0x86, 0x9d,
-	0xa2, 0xe7, 0x6e, 0x36, 0x5c, 0xc7, 0x65, 0x4d, 0xad, 0x4e, 0xa9, 0x57, 0xac, 0x51, 0x07, 0x7b,
-	0xda, 0x66, 0x03, 0xfb, 0x4d, 0xb5, 0xee, 0x53, 0x46, 0xe1, 0x4d, 0xe1, 0xa6, 0xa6, 0xdd, 0x62,
-	0x2f, 0x75, 0x6b, 0xc6, 0xc2, 0xcc, 0x9c, 0xc9, 0x4d, 0x54, 0x68, 0x85, 0x72, 0x0f, 0x2d, 0xfc,
-	0x15, 0x39, 0xe7, 0x6e, 0x9f, 0x14, 0xd3, 0xf4, 0xcd, 0x5a, 0x20, 0x8c, 0xf3, 0x36, 0xb7, 0xd6,
-	0x2c, 0x33, 0xc0, 0x9a, 0xc0, 0xd5, 0x6c, 0xea, 0x12, 0xb1, 0xfe, 0x56, 0x7a, 0x9d, 0x53, 0x8c,
-	0xad, 0xea, 0x66, 0xc5, 0x25, 0x26, 0x73, 0xa9, 0xb4, 0x7d, 0xa5, 0x42, 0x69, 0xc5, 0xc3, 0x9a,
-	0x59, 0x77, 0x35, 0x93, 0x10, 0xca, 0xf8, 0xa2, 0x8c, 0x34, 0x25, 0x56, 0xf9, 0x93, 0xd5, 0x58,
-	0xd7, 0x4c, 0xd2, 0x94, 0x4b, 0x51, 0x10, 0x23, 0x92, 0x12, 0x3d, 0x88, 0xa5, 0xc2, 0x41, 0x2f,
-	0xe6, 0xd6, 0x70, 0xc0, 0xcc, 0x5a, 0x5d, 0x0a, 0x38, 0x68, 0xe0, 0x34, 0xfc, 0x34, 0xa9, 0xe2,
-	0x89, 0x15, 0x08, 0xdc, 0xc4, 0x1c, 0x6d, 0x81, 0xa9, 0x47, 0xa1, 0xca, 0xc7, 0x01, 0xf6, 0x3f,
-	0x15, 0x4b, 0x81, 0x8e, 0x37, 0x1b, 0x38, 0x60, 0xf0, 0x0e, 0x18, 0x36, 0x1d, 0xc7, 0xc7, 0x41,
-	0x30, 0xa9, 0xdc, 0x50, 0xa6, 0x33, 0x25, 0xd8, 0x6e, 0x15, 0xae, 0x34, 0xcd, 0x9a, 0xb7, 0x80,
-	0xc4, 0x02, 0xd2, 0xa5, 0x09, 0xbc, 0x0d, 0x86, 0xc3, 0xf2, 0x1a, 0xae, 0x33, 0x39, 0x78, 0x43,
-	0x99, 0xbe, 0x98, 0xb6, 0x16, 0x0b, 0x48, 0x1f, 0x0a, 0x7f, 0x95, 0x1d, 0xf4, 0xbd, 0x02, 0x72,
-	0xdd, 0x02, 0x07, 0x75, 0x4a, 0x02, 0x0c, 0x29, 0xc8, 0x48, 0xa2, 0x61, 0xec, 0x0b, 0xd3, 0xd9,
-	0xd9, 0x87, 0x6a, 0x4f, 0x4d, 0xa2, 0x4a, 0xb0, 0xcf, 0x5d, 0xb6, 0xf1, 0x98, 0x38, 0xd8, 0xf7,
-	0x9a, 0x2e, 0xa9, 0x2c, 0x05, 0x01, 0x66, 0x25, 0x1f, 0x9b, 0x55, 0x87, 0x6e, 0x93, 0xd2, 0xc5,
-	0x9d, 0x56, 0x61, 0x40, 0x4f, 0x62, 0xa0, 0xcf, 0xc0, 0x24, 0xa7, 0x23, 0xbd, 0x4b, 0xcd, 0xb2,
-	0x23, 0xd3, 0x30, 0x0f, 0xb2, 0xd2, 0x30, 0x14, 0xa7, 0x70, 0x71, 0xd7, 0xdb, 0xad, 0x02, 0x94,
-	0xe2, 0xe2, 0x45, 0xa4, 0x03, 0xf9, 0x54, 0x76, 0xd0, 0x77, 0x8a, 0xc8, 0x6e, 0x27, 0xaa, 0xd0,
-	0x58, 0x03, 0x97, 0xa5, 0x2d, 0xc7, 0xfc, 0x4f, 0x24, 0xc6, 0x21, 0xd0, 0x17, 0x60, 0x5c, 0x70,
-	0xa1, 0x5e, 0x5c, 0xe1, 0x55, 0x00, 0x92, 0xb6, 0xe6, 0x65, 0xcb, 0xce, 0xde, 0x52, 0x45, 0x47,
-	0x86, 0x7b, 0x40, 0x8d, 0xb6, 0x69, 0x1c, 0xd9, 0xac, 0x60, 0xe1, 0xab, 0xa7, 0x3c, 0xd1, 0x4f,
-	0x0a, 0x80, 0x69, 0x74, 0x21, 0x71, 0x0e, 0x5c, 0x0a, 0xeb, 0x2d, 0x4b, 0x38, 0xa1, 0x46, 0xcd,
-	0xab, 0xca, 0xe6, 0x55, 0x97, 0x48, 0xb3, 0x94, 0x79, 0xfe, 0x6b, 0xf1, 0x52, 0xe8, 0x57, 0xd6,
-	0x23, 0x6b, 0x78, 0xaf, 0x0b, 0xab, 0x37, 0x4f, 0x64, 0x15, 0xc5, 0xec, 0xa0, 0x35, 0x21, 0x59,
-	0xf1, 0x11, 0x20, 0x88, 0xa3, 0x27, 0xe0, 0x5a, 0xc7, 0x5b, 0x41, 0x76, 0x19, 0x0c, 0x45, 0xa3,
-	0x42, 0x54, 0xe3, 0xe6, 0x09, 0xd5, 0x88, 0xdc, 0x45, 0x9e, 0x85, 0x2b, 0xfa, 0x43, 0x01, 0x63,
-	0x6b, 0xae, 0x5d, 0xfd, 0x48, 0x9a, 0x7d, 0x8c, 0x19, 0xac, 0x82, 0xd1, 0xd8, 0xcd, 0x20, 0x98,
-	0x89, 0xdd, 0xb4, 0x1a, 0x7a, 0xfe, 0xde, 0x2a, 0xdc, 0xaa, 0xb8, 0x6c, 0xa3, 0x61, 0xa9, 0x36,
-	0xad, 0x89, 0x61, 0x20, 0xfe, 0x14, 0x03, 0xa7, 0xaa, 0xb1, 0x66, 0x1d, 0x07, 0xea, 0x0a, 0xb6,
-	0xdb, 0xad, 0xc2, 0x44, 0xd4, 0x70, 0x1d, 0x60, 0x48, 0x1f, 0xf1, 0xd2, 0xc1, 0xbe, 0x04, 0x80,
-	0xb9, 0x76, 0xd5, 0x70, 0x89, 0x83, 0x9f, 0xf2, 0xe4, 0x65, 0x4a, 0x77, 0xfb, 0x88, 0x54, 0x26,
-	0xac, 0xdd, 0x2a, 0x64, 0xa3, 0x48, 0x21, 0x12, 0xd2, 0x33, 0xe1, 0x9f, 0x72, 0x88, 0x87, 0x76,
-	0x06, 0xc1, 0xff, 0x63, 0x6d, 0x2b, 0xb8, 0xce, 0x36, 0xc2, 0x26, 0xd4, 0x4d, 0x52, 0xc1, 0x70,
-	0x13, 0x8c, 0x25, 0xcc, 0xcc, 0x1a, 0x6d, 0x90, 0xf3, 0x56, 0x7a, 0x35, 0x7e, 0x5e, 0xe2, 0xf0,
-	0xa1, 0x58, 0x8f, 0x6e, 0x63, 0xdf, 0x08, 0x19, 0x9e, 0x93, 0x58, 0x0e, 0x18, 0xd6, 0x30, 0x44,
-	0x6f, 0xd4, 0xeb, 0x12, 0xfd, 0xc2, 0xb9, 0xa0, 0x73, 0xc0, 0x10, 0x1d, 0x3d, 0x1f, 0x04, 0xaf,
-	0xf3, 0x3e, 0x4c, 0xf7, 0x4a, 0x99, 0xac, 0xb8, 0x3e, 0xb6, 0xc3, 0xee, 0x95, 0x7b, 0x34, 0x35,
-	0x57, 0x95, 0x93, 0xe6, 0x2a, 0x54, 0xc1, 0x65, 0x46, 0xab, 0x98, 0x18, 0x2e, 0x11, 0xe9, 0xb8,
-	0xd6, 0x6e, 0x15, 0xae, 0x0a, 0x0a, 0x62, 0x05, 0xe9, 0xc3, 0xfc, 0x67, 0x99, 0x40, 0x0b, 0x80,
-	0x80, 0x99, 0x3e, 0x4b, 0x4b, 0x5c, 0xde, 0x69, 0x15, 0x94, 0xbe, 0x24, 0x8e, 0x47, 0xf8, 0x09,
-	0x12, 0xd2, 0x33, 0xfc, 0x81, 0xa7, 0xd1, 0x02, 0xc0, 0xa2, 0x0d, 0xe2, 0x44, 0x31, 0x2e, 0x9e,
-	0x2d, 0x46, 0x82, 0x84, 0xf4, 0x0c, 0x7f, 0xe0, 0xc9, 0xfc, 0x79, 0x10, 0xbc, 0x71, 0x7c, 0x32,
-	0xc5, 0x2e, 0xdf, 0x48, 0x37, 0xa9, 0x13, 0x36, 0xb0, 0x9c, 0x4e, 0xf3, 0x3d, 0x4e, 0xdf, 0x83,
-	0xdb, 0x5b, 0x4c, 0x80, 0xa4, 0x37, 0xf9, 0xb6, 0x08, 0xe0, 0x6b, 0x60, 0xc4, 0x6e, 0xf8, 0x3e,
-	0x26, 0x2c, 0xe9, 0xce, 0x0b, 0x7a, 0x56, 0xbc, 0xe3, 0x99, 0xd9, 0x06, 0xe3, 0xd2, 0x24, 0xf6,
-	0x16, 0x45, 0x78, 0xd0, 0xf7, 0x96, 0x99, 0x8c, 0x12, 0x74, 0x08, 0x10, 0xe9, 0x63, 0xe2, 0x5d,
-	0xcc, 0x1a, 0x3d, 0x02, 0x88, 0x67, 0x6b, 0x8d, 0x32, 0xd3, 0x8b, 0x5f, 0xaf, 0x52, 0x9f, 0xef,
-	0xe4, 0xd3, 0x74, 0x1e, 0xfa, 0x56, 0x11, 0xed, 0x7c, 0x14, 0xa6, 0x28, 0x80, 0x05, 0x32, 0x89,
-	0xd6, 0x28, 0xf3, 0x1f, 0xf4, 0x98, 0xf9, 0x23, 0x06, 0x8f, 0x3c, 0xcd, 0x13, 0xc5, 0x6b, 0xe2,
-	0xdc, 0x5d, 0xf6, 0x4c, 0xb7, 0x66, 0x5a, 0x1e, 0x5e, 0xc5, 0x38, 0x38, 0xf3, 0x71, 0xfe, 0x4c,
-	0x5c, 0x59, 0x0e, 0xa0, 0x0a, 0x5d, 0x06, 0xb8, 0x62, 0xcb, 0x05, 0x63, 0x1d, 0x63, 0xd9, 0x56,
-	0x53, 0x1d, 0x07, 0x97, 0x94, 0xb2, 0x4c, 0x5d, 0x52, 0x7a, 0x35, 0xe4, 0xdd, 0x6e, 0x15, 0xfe,
-	0x27, 0x2a, 0xd7, 0xe1, 0x8e, 0xf4, 0x51, 0x3b, 0x1d, 0x68, 0xf6, 0x9f, 0x2c, 0xb8, 0xc4, 0xe3,
-	0xc3, 0x5f, 0x14, 0xc0, 0x0f, 0xcc, 0x00, 0xbe, 0xdb, 0x63, 0xe6, 0x0e, 0x9d, 0xfc, 0xb9, 0xf7,
-	0x4e, 0xe1, 0x19, 0x29, 0x45, 0xef, 0x7c, 0xfd, 0xe2, 0xaf, 0x1f, 0x07, 0x55, 0x78, 0x47, 0xeb,
-	0x76, 0xd7, 0x4c, 0xae, 0x9a, 0xf1, 0xc5, 0x99, 0x53, 0xfd, 0x4d, 0x01, 0x43, 0xd1, 0x91, 0x09,
-	0xfb, 0x8b, 0x9d, 0x3e, 0xbb, 0x73, 0x0b, 0xa7, 0x71, 0x15, 0xbc, 0xe7, 0x38, 0x6f, 0x0d, 0x16,
-	0x7b, 0xe5, 0x1d, 0xb1, 0x7d, 0xa9, 0x80, 0xd1, 0x8e, 0x5b, 0x2a, 0x5c, 0xec, 0x87, 0x44, 0xb7,
-	0x9b, 0x75, 0x6e, 0xe9, 0x0c, 0x08, 0x42, 0x4d, 0x89, 0xab, 0x79, 0x1f, 0x2e, 0xf4, 0x5c, 0x05,
-	0x81, 0xa0, 0x7d, 0x25, 0x6e, 0xec, 0xcf, 0xe0, 0xdf, 0x0a, 0xb8, 0xde, 0x7d, 0xbb, 0xc2, 0x72,
-	0x3f, 0x0c, 0x8f, 0x1d, 0x23, 0xb9, 0x07, 0xe7, 0x01, 0x25, 0x54, 0xdf, 0xe7, 0xaa, 0x4b, 0x70,
-	0xb1, 0x47, 0xd5, 0x2c, 0x84, 0x4b, 0x66, 0xa1, 0xb1, 0x4e, 0x7d, 0xc3, 0xe7, 0x02, 0xbf, 0x49,
-	0xdf, 0x64, 0x3a, 0x0f, 0x0b, 0xd8, 0x17, 0xe3, 0xe3, 0x8f, 0xef, 0xdc, 0xc3, 0x73, 0xc1, 0x12,
-	0xf2, 0x3f, 0xe1, 0xf2, 0xcb, 0xf0, 0x5e, 0x8f, 0xf2, 0xf9, 0x3d, 0xd9, 0xe8, 0xb8, 0x45, 0x19,
-	0x2e, 0x31, 0x9c, 0x58, 0xe9, 0x0b, 0x05, 0x8c, 0x76, 0xcc, 0xb3, 0xfe, 0x9a, 0xbb, 0xdb, 0x80,
-	0xed, 0xaf, 0xb9, 0xbb, 0x0e, 0x53, 0x74, 0x97, 0xeb, 0x9c, 0x87, 0x73, 0x3d, 0xea, 0xec, 0x1c,
-	0x9d, 0x70, 0x57, 0x01, 0x23, 0xe9, 0x6f, 0x2e, 0xf8, 0x61, 0x7f, 0xd3, 0xee, 0xd0, 0x37, 0x60,
-	0x6e, 0xf1, 0xf4, 0x00, 0xa7, 0x94, 0x14, 0x1f, 0x43, 0x56, 0xd3, 0x70, 0x9d, 0x92, 0xb5, 0xb3,
-	0x97, 0x57, 0x76, 0xf7, 0xf2, 0xca, 0x9f, 0x7b, 0x79, 0xe5, 0x87, 0xfd, 0xfc, 0xc0, 0xee, 0x7e,
-	0x7e, 0xe0, 0xe5, 0x7e, 0x7e, 0xe0, 0xc9, 0xfd, 0xd4, 0x0d, 0x41, 0x40, 0x17, 0x3d, 0xd3, 0x0a,
-	0xe2, 0x38, 0x5b, 0x33, 0x73, 0xda, 0xd3, 0xa3, 0xfe, 0x1f, 0xc0, 0x6f, 0x10, 0x51, 0x9f, 0x58,
-	0x43, 0xfc, 0xbb, 0xec, 0xed, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x6d, 0x64, 0x2f, 0x52, 0xc6,
-	0x11, 0x00, 0x00,
+	// 1360 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0x5f, 0x6f, 0x13, 0x47,
+	0x10, 0xcf, 0x25, 0x24, 0xe0, 0x75, 0xc2, 0x9f, 0x25, 0x40, 0xb0, 0x5a, 0x9b, 0x6e, 0x0b, 0x8d,
+	0x0a, 0xbe, 0x13, 0x94, 0x88, 0x82, 0x4a, 0x4b, 0x2e, 0x28, 0x60, 0xa8, 0x68, 0xb9, 0x82, 0x2a,
+	0xd1, 0x4a, 0xa7, 0xf3, 0xdd, 0xe2, 0x9c, 0x7c, 0xde, 0x75, 0x6e, 0xf7, 0x00, 0xab, 0xe2, 0xa5,
+	0x7d, 0x6a, 0xa5, 0x4a, 0x95, 0xda, 0x8f, 0xd1, 0xa7, 0xaa, 0xea, 0x67, 0x40, 0x7d, 0x42, 0xe2,
+	0x05, 0x55, 0xaa, 0x55, 0x25, 0x7c, 0x02, 0xbf, 0x55, 0x7d, 0xa9, 0x6e, 0x6f, 0xf7, 0xee, 0x9c,
+	0x38, 0x89, 0x1d, 0xd2, 0x27, 0xdf, 0xde, 0xcc, 0xfc, 0x66, 0x7e, 0xb3, 0xb3, 0xb3, 0x73, 0x06,
+	0x0b, 0x94, 0xb5, 0x28, 0xf3, 0x99, 0xe1, 0x52, 0xe2, 0x62, 0xc2, 0x43, 0x87, 0x63, 0xaf, 0x1a,
+	0xf8, 0xab, 0x91, 0xef, 0xf9, 0xbc, 0x63, 0xb4, 0x29, 0x0d, 0xaa, 0x2d, 0xea, 0xe1, 0xc0, 0x58,
+	0x8d, 0x70, 0xd8, 0xd1, 0xdb, 0x21, 0xe5, 0x14, 0x9e, 0x96, 0x66, 0x7a, 0xde, 0x2c, 0xb5, 0xd2,
+	0x1f, 0x9d, 0xaf, 0x63, 0xee, 0x9c, 0x2f, 0xcd, 0x36, 0x68, 0x83, 0x0a, 0x0b, 0x23, 0x7e, 0x4a,
+	0x8c, 0x4b, 0x67, 0x77, 0xf2, 0xe9, 0x84, 0x4e, 0x8b, 0x49, 0xe5, 0xb2, 0x2b, 0xb4, 0x8d, 0xba,
+	0xc3, 0xb0, 0x21, 0x71, 0x0d, 0x97, 0xfa, 0x44, 0xca, 0xdf, 0xcb, 0xcb, 0x45, 0x88, 0xa9, 0x56,
+	0xdb, 0x69, 0xf8, 0xc4, 0xe1, 0x3e, 0x55, 0xba, 0x6f, 0x34, 0x28, 0x6d, 0x04, 0xd8, 0x70, 0xda,
+	0xbe, 0xe1, 0x10, 0x42, 0xb9, 0x10, 0x2a, 0x4f, 0x27, 0xa5, 0x54, 0xac, 0xea, 0xd1, 0x43, 0xc3,
+	0x21, 0x1d, 0x25, 0x4a, 0x9c, 0xd8, 0x09, 0x95, 0x64, 0x21, 0x45, 0x95, 0x8d, 0x56, 0xdc, 0x6f,
+	0x61, 0xc6, 0x9d, 0x56, 0x5b, 0x11, 0xd8, 0xa8, 0xe0, 0x45, 0x61, 0x3e, 0xa8, 0xea, 0x8e, 0x3b,
+	0xc0, 0xfc, 0x4c, 0x1d, 0x3d, 0x02, 0x27, 0xef, 0xc6, 0x2c, 0xef, 0x33, 0x1c, 0x7e, 0x26, 0x45,
+	0xcc, 0xc2, 0xab, 0x11, 0x66, 0x1c, 0x9e, 0x03, 0xfb, 0x1d, 0xcf, 0x0b, 0x31, 0x63, 0x73, 0xda,
+	0x29, 0x6d, 0xbe, 0x60, 0xc2, 0x5e, 0xb7, 0x72, 0xb0, 0xe3, 0xb4, 0x82, 0x2b, 0x48, 0x0a, 0x90,
+	0xa5, 0x54, 0xe0, 0x59, 0xb0, 0x3f, 0xde, 0x5e, 0xdb, 0xf7, 0xe6, 0xc6, 0x4f, 0x69, 0xf3, 0xfb,
+	0xf2, 0xda, 0x52, 0x80, 0xac, 0xa9, 0xf8, 0xa9, 0xe6, 0xa1, 0x1f, 0x34, 0x50, 0x1a, 0xe4, 0x98,
+	0xb5, 0x29, 0x61, 0x18, 0x52, 0x50, 0x50, 0x81, 0xc6, 0xbe, 0x27, 0xe6, 0x8b, 0x17, 0x6e, 0xeb,
+	0x43, 0x15, 0x89, 0xae, 0xc0, 0xbe, 0xf0, 0xf9, 0xca, 0x7d, 0xe2, 0xe1, 0x30, 0xe8, 0xf8, 0xa4,
+	0xb1, 0xc8, 0x18, 0xe6, 0x66, 0x88, 0x9d, 0xa6, 0x47, 0x1f, 0x13, 0x73, 0xdf, 0xb3, 0x6e, 0x65,
+	0xcc, 0xca, 0x7c, 0xa0, 0xcf, 0xc1, 0x9c, 0x08, 0x47, 0x59, 0x9b, 0x9d, 0x9a, 0xa7, 0xd2, 0x70,
+	0x09, 0x14, 0x95, 0x62, 0x4c, 0x4e, 0x13, 0xe4, 0x8e, 0xf7, 0xba, 0x15, 0xa8, 0xc8, 0xa5, 0x42,
+	0x64, 0x01, 0xb5, 0xaa, 0x79, 0xe8, 0x7b, 0x4d, 0x66, 0xb7, 0x1f, 0x55, 0x72, 0x6c, 0x81, 0x03,
+	0x4a, 0x57, 0x60, 0xfe, 0x2f, 0x14, 0x53, 0x17, 0xe8, 0x4b, 0x70, 0x44, 0xc6, 0x42, 0x83, 0x74,
+	0x87, 0x97, 0x01, 0xc8, 0xca, 0x5a, 0x6c, 0x5b, 0xf1, 0xc2, 0x19, 0x5d, 0x56, 0x64, 0x7c, 0x06,
+	0xf4, 0xe4, 0x98, 0xa6, 0x9e, 0x9d, 0x06, 0x96, 0xb6, 0x56, 0xce, 0x12, 0xfd, 0xac, 0x01, 0x98,
+	0x47, 0x97, 0x14, 0x17, 0xc0, 0x64, 0xbc, 0xdf, 0x6a, 0x0b, 0x67, 0xf5, 0xa4, 0x78, 0x75, 0x55,
+	0xbc, 0xfa, 0x22, 0xe9, 0x98, 0x85, 0x3f, 0x7e, 0xab, 0x4e, 0xc6, 0x76, 0x35, 0x2b, 0xd1, 0x86,
+	0x37, 0x06, 0x44, 0xf5, 0xee, 0x8e, 0x51, 0x25, 0x3e, 0xfb, 0xc2, 0x9a, 0x55, 0x51, 0x89, 0x16,
+	0x20, 0x03, 0x47, 0x0f, 0xc0, 0xd1, 0xbe, 0xb7, 0x32, 0xd8, 0x25, 0x30, 0x95, 0xb4, 0x0a, 0xb9,
+	0x1b, 0xa7, 0x77, 0xd8, 0x8d, 0xc4, 0x5c, 0xe6, 0x59, 0x9a, 0xa2, 0xbf, 0x34, 0x70, 0xf8, 0x9e,
+	0xef, 0x36, 0x3f, 0x51, 0x6a, 0x77, 0x30, 0x87, 0x4d, 0x30, 0x93, 0x9a, 0xd9, 0x04, 0x73, 0x79,
+	0x9a, 0x96, 0x63, 0xcb, 0x3f, 0xbb, 0x95, 0x33, 0x0d, 0x9f, 0xaf, 0x44, 0x75, 0xdd, 0xa5, 0x2d,
+	0xd9, 0x0c, 0xe4, 0x4f, 0x95, 0x79, 0x4d, 0x83, 0x77, 0xda, 0x98, 0xe9, 0xd7, 0xb1, 0xdb, 0xeb,
+	0x56, 0x66, 0x93, 0x82, 0xeb, 0x03, 0x43, 0xd6, 0x74, 0x90, 0x77, 0xf6, 0x15, 0x00, 0xdc, 0x77,
+	0x9b, 0xb6, 0x4f, 0x3c, 0xfc, 0x44, 0x24, 0xaf, 0x60, 0x5e, 0x1d, 0xc1, 0x53, 0x8d, 0xf0, 0x5e,
+	0xb7, 0x52, 0x4c, 0x3c, 0xc5, 0x48, 0xc8, 0x2a, 0xc4, 0x3f, 0xb5, 0x18, 0x0f, 0x3d, 0x1b, 0x07,
+	0x27, 0x52, 0x6e, 0xd7, 0x71, 0x9b, 0xaf, 0xc4, 0x45, 0x68, 0x39, 0xa4, 0x81, 0xe1, 0x2a, 0x38,
+	0x9c, 0x45, 0xe6, 0xb4, 0x68, 0x44, 0xf6, 0x9a, 0xe9, 0xa1, 0x74, 0xbd, 0x28, 0xe0, 0x63, 0xb2,
+	0x01, 0x7d, 0x8c, 0x43, 0x3b, 0x8e, 0x70, 0x8f, 0xc8, 0x0a, 0xc0, 0x78, 0x0f, 0x63, 0xf4, 0xa8,
+	0xdd, 0x56, 0xe8, 0x13, 0x7b, 0x82, 0x2e, 0x00, 0x63, 0x74, 0xf4, 0x6a, 0x1c, 0xbc, 0x2d, 0xea,
+	0x30, 0x5f, 0x2b, 0x35, 0x72, 0xdd, 0x0f, 0xb1, 0x1b, 0x57, 0xaf, 0x3a, 0xa3, 0xb9, 0xbe, 0xaa,
+	0xed, 0xd4, 0x57, 0xa1, 0x0e, 0x0e, 0x70, 0xda, 0xc4, 0xc4, 0xf6, 0x89, 0x4c, 0xc7, 0xd1, 0x5e,
+	0xb7, 0x72, 0x48, 0x86, 0x20, 0x25, 0xc8, 0xda, 0x2f, 0x1e, 0x6b, 0x04, 0x5e, 0x04, 0x80, 0x71,
+	0x27, 0xe4, 0x19, 0xc5, 0x09, 0xf3, 0x58, 0xaf, 0x5b, 0x39, 0x92, 0x58, 0x64, 0x32, 0x64, 0x15,
+	0xc4, 0x42, 0x24, 0xe6, 0x32, 0x98, 0x8e, 0x18, 0xb6, 0xdd, 0x48, 0xa6, 0x66, 0xdf, 0x29, 0x6d,
+	0xfe, 0x80, 0x79, 0xa2, 0xd7, 0xad, 0x1c, 0x4d, 0xec, 0xf2, 0x52, 0x64, 0x81, 0x88, 0xe1, 0xa5,
+	0x28, 0xc9, 0xe9, 0x45, 0x00, 0xea, 0x34, 0x22, 0x5e, 0x62, 0x38, 0xb9, 0xd1, 0x61, 0x26, 0x43,
+	0x56, 0x41, 0x2c, 0xf2, 0x0e, 0x09, 0xb5, 0xc5, 0xbb, 0xb9, 0xa9, 0x41, 0x0e, 0x95, 0x34, 0x71,
+	0x78, 0x87, 0x9a, 0x62, 0xf1, 0xcb, 0x38, 0x78, 0x67, 0xfb, 0x34, 0xcb, 0xf3, 0xbf, 0x92, 0x2f,
+	0x5f, 0x2f, 0x2e, 0x6d, 0xd5, 0xb7, 0x2e, 0x0d, 0xd9, 0x97, 0x37, 0x1e, 0x7c, 0xd9, 0x1b, 0xb2,
+	0xaa, 0x15, 0x07, 0x86, 0xc1, 0xb7, 0xc0, 0xb4, 0x1b, 0x85, 0x21, 0x26, 0x3c, 0xab, 0xdb, 0x09,
+	0xab, 0x28, 0xdf, 0x09, 0xc2, 0x8f, 0xc1, 0x11, 0xa5, 0x92, 0x5a, 0xcb, 0x0a, 0xbc, 0x35, 0xf2,
+	0x61, 0x9a, 0x4b, 0x72, 0xb4, 0x09, 0x10, 0x59, 0x87, 0xe5, 0xbb, 0x34, 0x6a, 0x74, 0x17, 0x20,
+	0x91, 0xad, 0x7b, 0x94, 0x3b, 0x41, 0xfa, 0x7a, 0x99, 0x86, 0xe2, 0x8c, 0xef, 0xa6, 0x26, 0xd1,
+	0x77, 0x9a, 0x2c, 0xf4, 0xad, 0x30, 0xe5, 0x06, 0xd4, 0x41, 0x21, 0xe3, 0x9a, 0x64, 0xfe, 0xa3,
+	0x21, 0x33, 0xbf, 0x45, 0x4b, 0x52, 0xf7, 0x7c, 0xc6, 0xf8, 0x9e, 0xbc, 0x91, 0x97, 0x02, 0xc7,
+	0x6f, 0x39, 0xf5, 0x00, 0x2f, 0x63, 0xcc, 0x5e, 0xfb, 0xa2, 0x7f, 0x2a, 0x87, 0x99, 0x0d, 0xa8,
+	0x92, 0x97, 0x0d, 0x0e, 0xba, 0x4a, 0x60, 0x3f, 0xc4, 0x58, 0x95, 0xd5, 0xc9, 0xbe, 0x2b, 0x4d,
+	0x51, 0x59, 0xa2, 0x3e, 0x31, 0xdf, 0x8c, 0xe3, 0xee, 0x75, 0x2b, 0xc7, 0xe4, 0xce, 0xf5, 0x99,
+	0x23, 0x6b, 0xc6, 0xcd, 0x3b, 0xba, 0xf0, 0x6f, 0x11, 0x4c, 0x0a, 0xff, 0xf0, 0x57, 0x0d, 0x88,
+	0xab, 0x94, 0xc1, 0x0f, 0x86, 0xcc, 0xdc, 0xa6, 0x99, 0xa0, 0x74, 0x79, 0x17, 0x96, 0x09, 0x53,
+	0x74, 0xf1, 0x9b, 0x17, 0xaf, 0x7e, 0x1a, 0xd7, 0xe1, 0x39, 0x63, 0xd0, 0x14, 0x9a, 0x0d, 0xa1,
+	0xe9, 0x48, 0x2d, 0x42, 0xfd, 0x5d, 0x03, 0x53, 0xc9, 0x65, 0x0a, 0x47, 0xf3, 0x9d, 0xbf, 0xd5,
+	0x4b, 0x57, 0x76, 0x63, 0x2a, 0xe3, 0x5e, 0x10, 0x71, 0x1b, 0xb0, 0x3a, 0x6c, 0xdc, 0x49, 0xb4,
+	0x2f, 0x35, 0x30, 0xd3, 0x37, 0xbf, 0xc2, 0x6b, 0xa3, 0x04, 0x31, 0x68, 0xe6, 0x2e, 0x2d, 0xbe,
+	0x06, 0x82, 0x64, 0x63, 0x0a, 0x36, 0x1f, 0xc2, 0x2b, 0x43, 0xef, 0x82, 0x44, 0x30, 0xbe, 0x96,
+	0xb3, 0xfc, 0x53, 0xf8, 0x8f, 0x06, 0x8e, 0x0f, 0x3e, 0xae, 0xb0, 0x36, 0x4a, 0x84, 0xdb, 0xb6,
+	0x91, 0xd2, 0xad, 0xbd, 0x80, 0x92, 0xac, 0x6f, 0x0a, 0xd6, 0x26, 0xbc, 0x36, 0x24, 0x6b, 0x1e,
+	0xc3, 0x65, 0xbd, 0xd0, 0x7e, 0x48, 0x43, 0x3b, 0x14, 0x04, 0xbf, 0xcd, 0xcf, 0x38, 0xfd, 0x97,
+	0x05, 0x1c, 0x29, 0xe2, 0xed, 0x2f, 0xf6, 0xd2, 0xed, 0x3d, 0xc1, 0x92, 0xf4, 0x3f, 0x15, 0xf4,
+	0x6b, 0xf0, 0xc6, 0x90, 0xf4, 0xc5, 0x04, 0x6d, 0xf7, 0xcd, 0x57, 0xb6, 0x4f, 0x6c, 0x2f, 0x65,
+	0xfa, 0x42, 0x03, 0x33, 0x7d, 0xfd, 0x6c, 0xb4, 0xe2, 0x1e, 0xd4, 0x60, 0x47, 0x2b, 0xee, 0x81,
+	0xcd, 0x14, 0x5d, 0x15, 0x3c, 0x2f, 0xc1, 0x85, 0x21, 0x79, 0xf6, 0xb7, 0x4e, 0xf8, 0x5c, 0x03,
+	0xd3, 0xf9, 0xaf, 0x31, 0xf8, 0xf1, 0x68, 0xdd, 0x6e, 0xd3, 0xd7, 0x61, 0xe9, 0xda, 0xee, 0x01,
+	0x76, 0x49, 0x29, 0xbd, 0x86, 0xea, 0x1d, 0xdb, 0xf7, 0xcc, 0xfa, 0xb3, 0xb5, 0xb2, 0xf6, 0x7c,
+	0xad, 0xac, 0xfd, 0xbd, 0x56, 0xd6, 0x7e, 0x5c, 0x2f, 0x8f, 0x3d, 0x5f, 0x2f, 0x8f, 0xbd, 0x5c,
+	0x2f, 0x8f, 0x3d, 0xb8, 0x99, 0x9b, 0x10, 0x24, 0x74, 0x35, 0x70, 0xea, 0x2c, 0xf5, 0xf3, 0xe8,
+	0xfc, 0x82, 0xf1, 0x64, 0xab, 0x7f, 0x0a, 0xc4, 0x04, 0x91, 0xd4, 0x49, 0x7d, 0x4a, 0x7c, 0xb1,
+	0xbd, 0xff, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x53, 0xb8, 0xa9, 0xb3, 0xe0, 0x11, 0x00, 0x00,
 }
 
 // Reference imports to suppress errors if they are not otherwise used.
@@ -1581,29 +1613,35 @@ func (m *QueryLiquidityNetInDirectionRequest) MarshalToSizedBuffer(dAtA []byte)
 	_ = i
 	var l int
 	_ = l
-	if m.BoundTick != nil {
-		{
-			size := m.BoundTick.Size()
-			i -= size
-			if _, err := m.BoundTick.MarshalTo(dAtA[i:]); err != nil {
-				return 0, err
-			}
-			i = encodeVarintQuery(dAtA, i, uint64(size))
+	if m.UseNoBound {
+		i--
+		if m.UseNoBound {
+			dAtA[i] = 1
+		} else {
+			dAtA[i] = 0
 		}
 		i--
-		dAtA[i] = 0x22
+		dAtA[i] = 0x30
 	}
-	if m.StartTick != nil {
-		{
-			size := m.StartTick.Size()
-			i -= size
-			if _, err := m.StartTick.MarshalTo(dAtA[i:]); err != nil {
-				return 0, err
-			}
-			i = encodeVarintQuery(dAtA, i, uint64(size))
+	if m.BoundTick != 0 {
+		i = encodeVarintQuery(dAtA, i, uint64(m.BoundTick))
+		i--
+		dAtA[i] = 0x28
+	}
+	if m.UseCurTick {
+		i--
+		if m.UseCurTick {
+			dAtA[i] = 1
+		} else {
+			dAtA[i] = 0
 		}
 		i--
-		dAtA[i] = 0x1a
+		dAtA[i] = 0x20
+	}
+	if m.StartTick != 0 {
+		i = encodeVarintQuery(dAtA, i, uint64(m.StartTick))
+		i--
+		dAtA[i] = 0x18
 	}
 	if len(m.TokenIn) > 0 {
 		i -= len(m.TokenIn)
@@ -1960,13 +1998,17 @@ func (m *QueryLiquidityNetInDirectionRequest) Size() (n int) {
 	if l > 0 {
 		n += 1 + l + sovQuery(uint64(l))
 	}
-	if m.StartTick != nil {
-		l = m.StartTick.Size()
-		n += 1 + l + sovQuery(uint64(l))
+	if m.StartTick != 0 {
+		n += 1 + sovQuery(uint64(m.StartTick))
 	}
-	if m.BoundTick != nil {
-		l = m.BoundTick.Size()
-		n += 1 + l + sovQuery(uint64(l))
+	if m.UseCurTick {
+		n += 2
+	}
+	if m.BoundTick != 0 {
+		n += 1 + sovQuery(uint64(m.BoundTick))
+	}
+	if m.UseNoBound {
+		n += 2
 	}
 	return n
 }
@@ -3078,10 +3120,10 @@ func (m *QueryLiquidityNetInDirectionRequest) Unmarshal(dAtA []byte) error {
 			m.TokenIn = string(dAtA[iNdEx:postIndex])
 			iNdEx = postIndex
 		case 3:
-			if wireType != 2 {
+			if wireType != 0 {
 				return fmt.Errorf("proto: wrong wireType = %d for field StartTick", wireType)
 			}
-			var stringLen uint64
+			m.StartTick = 0
 			for shift := uint(0); ; shift += 7 {
 				if shift >= 64 {
 					return ErrIntOverflowQuery
@@ -3091,33 +3133,16 @@ func (m *QueryLiquidityNetInDirectionRequest) Unmarshal(dAtA []byte) error {
 				}
 				b := dAtA[iNdEx]
 				iNdEx++
-				stringLen |= uint64(b&0x7F) << shift
+				m.StartTick |= int64(b&0x7F) << shift
 				if b < 0x80 {
 					break
 				}
 			}
-			intStringLen := int(stringLen)
-			if intStringLen < 0 {
-				return ErrInvalidLengthQuery
-			}
-			postIndex := iNdEx + intStringLen
-			if postIndex < 0 {
-				return ErrInvalidLengthQuery
-			}
-			if postIndex > l {
-				return io.ErrUnexpectedEOF
-			}
-			var v github_com_cosmos_cosmos_sdk_types.Int
-			m.StartTick = &v
-			if err := m.StartTick.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
-				return err
-			}
-			iNdEx = postIndex
 		case 4:
-			if wireType != 2 {
-				return fmt.Errorf("proto: wrong wireType = %d for field BoundTick", wireType)
+			if wireType != 0 {
+				return fmt.Errorf("proto: wrong wireType = %d for field UseCurTick", wireType)
 			}
-			var stringLen uint64
+			var v int
 			for shift := uint(0); ; shift += 7 {
 				if shift >= 64 {
 					return ErrIntOverflowQuery
@@ -3127,28 +3152,51 @@ func (m *QueryLiquidityNetInDirectionRequest) Unmarshal(dAtA []byte) error {
 				}
 				b := dAtA[iNdEx]
 				iNdEx++
-				stringLen |= uint64(b&0x7F) << shift
+				v |= int(b&0x7F) << shift
 				if b < 0x80 {
 					break
 				}
 			}
-			intStringLen := int(stringLen)
-			if intStringLen < 0 {
-				return ErrInvalidLengthQuery
+			m.UseCurTick = bool(v != 0)
+		case 5:
+			if wireType != 0 {
+				return fmt.Errorf("proto: wrong wireType = %d for field BoundTick", wireType)
 			}
-			postIndex := iNdEx + intStringLen
-			if postIndex < 0 {
-				return ErrInvalidLengthQuery
+			m.BoundTick = 0
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowQuery
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				m.BoundTick |= int64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
 			}
-			if postIndex > l {
-				return io.ErrUnexpectedEOF
+		case 6:
+			if wireType != 0 {
+				return fmt.Errorf("proto: wrong wireType = %d for field UseNoBound", wireType)
 			}
-			var v github_com_cosmos_cosmos_sdk_types.Int
-			m.BoundTick = &v
-			if err := m.BoundTick.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
-				return err
+			var v int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowQuery
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				v |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
 			}
-			iNdEx = postIndex
+			m.UseNoBound = bool(v != 0)
 		default:
 			iNdEx = preIndex
 			skippy, err := skipQuery(dAtA[iNdEx:])
diff --git a/x/ibc-hooks/client/cli/query.go b/x/ibc-hooks/client/cli/query.go
index cd9b8aaa0..c17c60294 100644
--- a/x/ibc-hooks/client/cli/query.go
+++ b/x/ibc-hooks/client/cli/query.go
@@ -35,7 +35,6 @@ func GetQueryCmd() *cobra.Command {
 		RunE:                       indexRunCmd,
 	}
 
-	cmd.Short = fmt.Sprintf("Querying commands for the %s module", types.ModuleName)
 	cmd.AddCommand(
 		GetCmdWasmSender(),
 	)
diff --git a/x/pool-incentives/keeper/genesis.go b/x/pool-incentives/keeper/genesis.go
index 8a5a67dbc..d44883f13 100644
--- a/x/pool-incentives/keeper/genesis.go
+++ b/x/pool-incentives/keeper/genesis.go
@@ -4,6 +4,7 @@ import (
 	sdk "github.com/cosmos/cosmos-sdk/types"
 
 	"github.com/osmosis-labs/osmosis/v15/x/pool-incentives/types"
+	poolmanagertypes "github.com/osmosis-labs/osmosis/v15/x/poolmanager/types"
 )
 
 func (k Keeper) InitGenesis(ctx sdk.Context, genState *types.GenesisState) {
@@ -29,17 +30,35 @@ func (k Keeper) ExportGenesis(ctx sdk.Context) *types.GenesisState {
 	lastPoolId := k.poolmanagerKeeper.GetNextPoolId(ctx)
 	lockableDurations := k.GetLockableDurations(ctx)
 	var poolToGauges types.PoolToGauges
-	for i := 1; i < int(lastPoolId); i++ {
-		for _, duration := range lockableDurations {
-			gaugeID, err := k.GetPoolGaugeId(ctx, uint64(i), duration)
+	for poolId := 1; poolId < int(lastPoolId); poolId++ {
+		pool, err := k.poolmanagerKeeper.GetPool(ctx, uint64(poolId))
+		if err != nil {
+			panic(err)
+		}
+		isCLPool := pool.GetType() == poolmanagertypes.Concentrated
+		if isCLPool {
+			incParams := k.incentivesKeeper.GetEpochInfo(ctx)
+			gaugeID, err := k.GetPoolGaugeId(ctx, uint64(poolId), incParams.Duration)
 			if err != nil {
 				panic(err)
 			}
 			var poolToGauge types.PoolToGauge
-			poolToGauge.Duration = duration
+			poolToGauge.Duration = incParams.Duration
 			poolToGauge.GaugeId = gaugeID
-			poolToGauge.PoolId = uint64(i)
+			poolToGauge.PoolId = uint64(poolId)
 			poolToGauges.PoolToGauge = append(poolToGauges.PoolToGauge, poolToGauge)
+		} else {
+			for _, duration := range lockableDurations {
+				gaugeID, err := k.GetPoolGaugeId(ctx, uint64(poolId), duration)
+				if err != nil {
+					panic(err)
+				}
+				var poolToGauge types.PoolToGauge
+				poolToGauge.Duration = duration
+				poolToGauge.GaugeId = gaugeID
+				poolToGauge.PoolId = uint64(poolId)
+				poolToGauges.PoolToGauge = append(poolToGauges.PoolToGauge, poolToGauge)
+			}
 		}
 	}
 
diff --git a/x/pool-incentives/keeper/keeper.go b/x/pool-incentives/keeper/keeper.go
index dd266ca4e..bfc2ce1f2 100644
--- a/x/pool-incentives/keeper/keeper.go
+++ b/x/pool-incentives/keeper/keeper.go
@@ -110,7 +110,7 @@ func (k Keeper) CreateConcentratedLiquidityPoolGauge(ctx sdk.Context, poolId uin
 		sdk.Coins{},
 		// dummy variable so that the existing logic does not break
 		// CreateGauge checks if LockQueryType is `ByDuration` or not, we bypass this check by passing
-		// lockQueryType as byTime. Although we donot need this check, we still cannot pass empty struct.
+		// lockQueryType as byTime. Although we do not need this check, we still cannot pass empty struct.
 		lockuptypes.QueryCondition{
 			LockQueryType: lockuptypes.ByTime,
 			Denom:         appparams.BaseCoinUnit,


Test patch:
diff --git a/app/modules_test.go b/app/modules_test.go
index 3790e3aae..e2e7cda98 100644
--- a/app/modules_test.go
+++ b/app/modules_test.go
@@ -12,7 +12,7 @@ import (
 
 func TestOrderEndBlockers_Determinism(t *testing.T) {
 	db := dbm.NewMemDB()
-	app := NewOsmosisApp(log.NewNopLogger(), db, nil, true, map[int64]bool{}, DefaultNodeHome, 5, simapp.EmptyAppOptions{}, GetWasmEnabledProposals(), EmptyWasmOpts)
+	app := NewOsmosisApp(log.NewNopLogger(), db, nil, true, map[int64]bool{}, DefaultNodeHome, 5, simapp.EmptyAppOptions{}, EmptyWasmOpts)
 
 	for i := 0; i < 1000; i++ {
 		a := OrderEndBlockers(app.mm.ModuleNames())
diff --git a/app/test_helpers.go b/app/test_helpers.go
index 331e7c158..83a12f8cb 100644
--- a/app/test_helpers.go
+++ b/app/test_helpers.go
@@ -29,7 +29,7 @@ func getDefaultGenesisStateBytes() []byte {
 // Setup initializes a new OsmosisApp.
 func Setup(isCheckTx bool) *OsmosisApp {
 	db := dbm.NewMemDB()
-	app := NewOsmosisApp(log.NewNopLogger(), db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, simapp.EmptyAppOptions{}, GetWasmEnabledProposals(), EmptyWasmOpts)
+	app := NewOsmosisApp(log.NewNopLogger(), db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, simapp.EmptyAppOptions{}, EmptyWasmOpts)
 	if !isCheckTx {
 		stateBytes := getDefaultGenesisStateBytes()
 
@@ -56,7 +56,7 @@ func SetupTestingAppWithLevelDb(isCheckTx bool) (app *OsmosisApp, cleanupFn func
 	if err != nil {
 		panic(err)
 	}
-	app = NewOsmosisApp(log.NewNopLogger(), db, nil, true, map[int64]bool{}, DefaultNodeHome, 5, simapp.EmptyAppOptions{}, GetWasmEnabledProposals(), EmptyWasmOpts)
+	app = NewOsmosisApp(log.NewNopLogger(), db, nil, true, map[int64]bool{}, DefaultNodeHome, 5, simapp.EmptyAppOptions{}, EmptyWasmOpts)
 	if !isCheckTx {
 		genesisState := NewDefaultGenesisState()
 		stateBytes, err := json.MarshalIndent(genesisState, "", " ")
diff --git a/tests/cl-go-client/README.md b/tests/cl-go-client/README.md
index 1860f8675..75d7c6089 100644
--- a/tests/cl-go-client/README.md
+++ b/tests/cl-go-client/README.md
@@ -13,7 +13,12 @@ setting up a concentrated liquidity pool with positions.
 
 Make sure that you run `localosmosis` in the background and have keys
 added to your keyring with:
+
 ```bash
+make set-env localosmosis # sets environment to $HOME/.osmosisd-local
+
+make localnet-start
+
 make localnet-keys
 ```
 
@@ -22,14 +27,10 @@ See `tests/localosmosis` for more info.
 ## Running
 
 ```bash
-go run tests/cl-go-client/main.go
+make localnet-cl-create-positions
 ```
 
 In the current state, it does the following:
 - Queries status of the chain to make sure it's running.
 - Queries pool with id 1. If does not exist, creates it
 - Sets up one CL position
-
-## TODOs
-
-- Create many positions across multiple accounts with randomized parameters.
diff --git a/tests/cl-go-client/main.go b/tests/cl-go-client/main.go
index c7385e5e2..399250782 100644
--- a/tests/cl-go-client/main.go
+++ b/tests/cl-go-client/main.go
@@ -6,6 +6,7 @@ import (
 	"log"
 	"math"
 	"math/rand"
+	"os/user"
 	"strings"
 	"sync"
 	"time"
@@ -23,34 +24,37 @@ import (
 )
 
 const (
-	expectedPoolId     uint64 = 1
-	addressPrefix             = "osmo"
-	clientHomePath            = "/root/.osmosisd-local"
-	consensusFee              = "1500uosmo"
-	denom0                    = "uosmo"
-	denom1                    = "uion"
-	accountNamePrefix         = "lo-test"
-	numPositions              = 1_000
-	minAmountDeposited        = int64(1_000_000)
-	randSeed                  = 1
-	maxAmountDeposited        = 1_00_000_000
+	expectedPoolId           uint64 = 1
+	addressPrefix                   = "osmo"
+	localosmosisFromHomePath        = "/.osmosisd-local"
+	consensusFee                    = "1500uosmo"
+	denom0                          = "uosmo"
+	denom1                          = "uion"
+	accountNamePrefix               = "lo-test"
+	numPositions                    = 1_000
+	minAmountDeposited              = int64(1_000_000)
+	randSeed                        = 1
+	maxAmountDeposited              = 1_00_000_000
 )
 
 var (
 	defaultAccountName = fmt.Sprintf("%s%d", accountNamePrefix, 1)
 	exponentAtPriceOne = sdk.OneInt().Neg()
 	defaultMinAmount   = sdk.ZeroInt()
+	accountMutex       sync.Mutex
 )
 
 func main() {
 	ctx := context.Background()
 
+	clientHome := getClientHomePath()
+
 	// Create a Cosmos igniteClient instance
 	igniteClient, err := cosmosclient.New(
 		ctx,
 		cosmosclient.WithAddressPrefix(addressPrefix),
 		cosmosclient.WithKeyringBackend(cosmosaccount.KeyringTest),
-		cosmosclient.WithHome(clientHomePath),
+		cosmosclient.WithHome(clientHome),
 	)
 	if err != nil {
 		log.Fatal(err)
@@ -67,6 +71,13 @@ func main() {
 	// Instantiate a query client
 	clQueryClient := poolmanagerqueryproto.NewQueryClient(igniteClient.Context())
 
+	// Print warnings with common problems
+	log.Println(fmt.Sprintf("\n\n\nWARNING 1: your localosmosis and client home are assummed to be %s. Run 'osmosisd get-env' and confirm it matches the path you see printed here\n\n\n", clientHome))
+
+	log.Println(fmt.Sprintf("\n\n\nWARNING 2: you are attempting to interact with pool id %d.\nConfirm that the pool exists. if this is not the pool you want to interact with, please change the expectedPoolId variable in the code\n\n\n", expectedPoolId))
+
+	log.Println("\n\n\nWARNING 3: sometimes the script hangs when just started. In that case, kill it and restart\n\n\n")
+
 	// Query pool with id 1 and create new if does not exist.
 	_, err = clQueryClient.Pool(ctx, &poolmanagerqueryproto.PoolRequest{PoolId: expectedPoolId})
 	if err != nil {
@@ -84,41 +95,36 @@ func main() {
 
 	rand.Seed(randSeed)
 
-	var wg sync.WaitGroup
 	for i := 0; i < numPositions; i++ {
-		wg.Add(1)
-		go func(i int) {
-			defer wg.Done()
-			var (
-				// 1 to 9. These are localosmosis keyring test accounts with names such as:
-				// lo-test1
-				// lo-test2
-				// ...
-				randAccountNum = rand.Intn(8) + 1
-				accountName    = fmt.Sprintf("%s%d", accountNamePrefix, randAccountNum)
-				// minTick <= lowerTick <= upperTick
-				lowerTick = rand.Int63n(maxTick-minTick+1) + minTick
-				// lowerTick <= upperTick <= maxTick
-				upperTick = maxTick - rand.Int63n(int64(math.Abs(float64(maxTick-lowerTick))))
-
-				tokenDesired0 = sdk.NewCoin(denom0, sdk.NewInt(rand.Int63n(maxAmountDeposited)))
-				tokenDesired1 = sdk.NewCoin(denom1, sdk.NewInt(rand.Int63n(maxAmountDeposited)))
-			)
-
-			log.Println("creating position: pool id", expectedPoolId, "accountName", accountName, "lowerTick", lowerTick, "upperTick", upperTick, "token0Desired", tokenDesired0, "tokenDesired1", tokenDesired1, "defaultMinAmount", defaultMinAmount)
-
-			maxRetries := 100
-			for j := 0; j < maxRetries; j++ {
-				amt0, amt1, liquidity := createPosition(igniteClient, expectedPoolId, accountName, lowerTick, upperTick, tokenDesired0, tokenDesired1, defaultMinAmount, defaultMinAmount)
-				if err == nil {
-					log.Println("created position: amt0", amt0, "amt1", amt1, "liquidity", liquidity)
-					break
-				}
-				time.Sleep(8 * time.Second)
+		var (
+			// 1 to 9. These are localosmosis keyring test accounts with names such as:
+			// lo-test1
+			// lo-test2
+			// ...
+			randAccountNum = rand.Intn(8) + 1
+			accountName    = fmt.Sprintf("%s%d", accountNamePrefix, randAccountNum)
+			// minTick <= lowerTick <= upperTick
+			lowerTick = rand.Int63n(maxTick-minTick+1) + minTick
+			// lowerTick <= upperTick <= maxTick
+			upperTick = maxTick - rand.Int63n(int64(math.Abs(float64(maxTick-lowerTick))))
+
+			tokenDesired0 = sdk.NewCoin(denom0, sdk.NewInt(rand.Int63n(maxAmountDeposited)))
+			tokenDesired1 = sdk.NewCoin(denom1, sdk.NewInt(rand.Int63n(maxAmountDeposited)))
+		)
+
+		log.Println("creating position: pool id", expectedPoolId, "accountName", accountName, "lowerTick", lowerTick, "upperTick", upperTick, "token0Desired", tokenDesired0, "tokenDesired1", tokenDesired1, "defaultMinAmount", defaultMinAmount)
+
+		maxRetries := 100
+		for j := 0; j < maxRetries; j++ {
+			amt0, amt1, liquidity := createPosition(igniteClient, expectedPoolId, accountName, lowerTick, upperTick, tokenDesired0, tokenDesired1, defaultMinAmount, defaultMinAmount)
+			if err == nil {
+				log.Println("created position: amt0", amt0, "amt1", amt1, "liquidity", liquidity)
+				break
 			}
-		}(i)
+			time.Sleep(8 * time.Second)
+		}
 	}
-	wg.Wait()
+
 }
 
 func createPool(igniteClient cosmosclient.Client, accountName string) uint64 {
@@ -142,9 +148,13 @@ func createPool(igniteClient cosmosclient.Client, accountName string) uint64 {
 }
 
 func createPosition(client cosmosclient.Client, poolId uint64, senderKeyringAccountName string, lowerTick int64, upperTick int64, tokenDesired0, tokenDesired1 sdk.Coin, tokenMinAmount0, tokenMinAmount1 sdk.Int) (amountCreated0, amountCreated1 sdk.Int, liquidityCreated sdk.Dec) {
+	accountMutex.Lock() // Lock access to getAccountAddressFromKeyring
+	senderAddress := getAccountAddressFromKeyring(client, senderKeyringAccountName)
+	accountMutex.Unlock() // Unlock access to getAccountAddressFromKeyring
+
 	msg := &cltypes.MsgCreatePosition{
 		PoolId:          poolId,
-		Sender:          getAccountAddressFromKeyring(client, senderKeyringAccountName),
+		Sender:          senderAddress,
 		LowerTick:       lowerTick,
 		UpperTick:       upperTick,
 		TokenDesired0:   tokenDesired0,
@@ -153,6 +163,7 @@ func createPosition(client cosmosclient.Client, poolId uint64, senderKeyringAcco
 		TokenMinAmount1: tokenMinAmount1,
 	}
 	txResp, err := client.BroadcastTx(senderKeyringAccountName, msg)
+
 	if err != nil {
 		log.Fatal(err)
 	}
@@ -175,3 +186,13 @@ func getAccountAddressFromKeyring(igniteClient cosmosclient.Client, accountName
 	}
 	return address
 }
+
+func getClientHomePath() string {
+	currentUser, err := user.Current()
+	if err != nil {
+		log.Fatal(err)
+		return ""
+	}
+
+	return currentUser.HomeDir + localosmosisFromHomePath
+}
diff --git a/tests/e2e/configurer/chain/commands.go b/tests/e2e/configurer/chain/commands.go
index 4f46cd927..c8dfcc78f 100644
--- a/tests/e2e/configurer/chain/commands.go
+++ b/tests/e2e/configurer/chain/commands.go
@@ -57,6 +57,18 @@ func (n *NodeConfig) CreateStableswapPool(poolFile, from string) uint64 {
 	return poolID
 }
 
+// CollectFees collects fees earned by concentrated position in range of [lowerTick; upperTick] in pool with id of poolId
+func (n *NodeConfig) CollectFees(from, positionIds string) {
+	n.LogActionF("collecting fees from concentrated position")
+	cmd := []string{"osmosisd", "tx", "concentratedliquidity", "collect-fees", positionIds, fmt.Sprintf("--from=%s", from)}
+	_, _, err := n.containerManager.ExecTxCmd(n.t, n.chainId, n.Name, cmd)
+	require.NoError(n.t, err)
+
+	n.LogActionF("successfully collected fees for account %s", from)
+}
+
+// CreateConcentratedPool creates a concentrated pool.
+// Returns pool id of newly created pool on success
 func (n *NodeConfig) CreateConcentratedPool(from, denom1, denom2 string, tickSpacing uint64, exponentAtPriceOne int64, swapFee string) uint64 {
 	n.LogActionF("creating concentrated pool")
 
@@ -69,6 +81,8 @@ func (n *NodeConfig) CreateConcentratedPool(from, denom1, denom2 string, tickSpa
 	return poolID
 }
 
+// CreateConcentratedPosition creates a concentrated position from [lowerTick; upperTick] in pool with id of poolId
+// token{0,1} - liquidity to create position with
 func (n *NodeConfig) CreateConcentratedPosition(from, lowerTick, upperTick string, token0, token1 string, token0MinAmt, token1MinAmt int64, poolId uint64) uint64 {
 	n.LogActionF("creating concentrated position")
 
diff --git a/tests/e2e/e2e_test.go b/tests/e2e/e2e_test.go
index 5869f8c7e..ac7b89813 100644
--- a/tests/e2e/e2e_test.go
+++ b/tests/e2e/e2e_test.go
@@ -19,8 +19,6 @@ import (
 
 	ibchookskeeper "github.com/osmosis-labs/osmosis/x/ibc-hooks/keeper"
 
-	"github.com/osmosis-labs/osmosis/v15/x/concentrated-liquidity/model"
-	"github.com/osmosis-labs/osmosis/v15/x/concentrated-liquidity/types"
 	ibcratelimittypes "github.com/osmosis-labs/osmosis/v15/x/ibc-rate-limit/types"
 
 	sdk "github.com/cosmos/cosmos-sdk/types"
@@ -191,26 +189,24 @@ func (s *IntegrationTestSuite) TestConcentratedLiquidity() {
 	s.Require().NoError(err)
 
 	var (
-		denom0                    string = "uion"
-		denom1                    string = "uosmo"
-		tickSpacing               uint64 = 1
-		exponentAtPriceOne        int64  = -1
-		swapFee                          = "0.01"
+		denom0             string  = "uion"
+		denom1             string  = "uosmo"
+		tickSpacing        uint64  = 1
+		exponentAtPriceOne int64   = -1
+		swapFee                    = "0.01"
+		swapFeeDec         sdk.Dec = sdk.MustNewDecFromStr("0.01")
 	)
 
-	// helpers
-	var (
-		updatedPool = func(poolId uint64) types.ConcentratedPoolExtension {
-			concentratedPool, err := node.QueryConcentratedPool(poolId)
-			s.Require().NoError(err)
-			return concentratedPool
-		}
-	)
 	poolID := node.CreateConcentratedPool(initialization.ValidatorWalletName, denom0, denom1, tickSpacing, exponentAtPriceOne, swapFee)
 
-	concentratedPool := updatedPool(poolID)
+	concentratedPool := s.updatedPool(node, poolID)
 
-	// assert contents of the pool are valid
+	// Sanity check that pool initialized with valid parameters (the ones that we haven't explicitly specified)
+	s.Require().Equal(concentratedPool.GetCurrentTick(), sdk.ZeroInt())
+	s.Require().Equal(concentratedPool.GetCurrentSqrtPrice(), sdk.ZeroDec())
+	s.Require().Equal(concentratedPool.GetLiquidity(), sdk.ZeroDec())
+
+	// Assert contents of the pool are valid (that we explicitly specified)
 	s.Require().Equal(concentratedPool.GetId(), poolID)
 	s.Require().Equal(concentratedPool.GetToken0(), denom0)
 	s.Require().Equal(concentratedPool.GetToken1(), denom1)
@@ -218,65 +214,438 @@ func (s *IntegrationTestSuite) TestConcentratedLiquidity() {
 	s.Require().Equal(concentratedPool.GetExponentAtPriceOne(), sdk.NewInt(exponentAtPriceOne))
 	s.Require().Equal(concentratedPool.GetSwapFee(sdk.Context{}), sdk.MustNewDecFromStr(swapFee))
 
+	// Concentrated Positions
 	minTick, maxTick := cl.GetMinAndMaxTicksFromExponentAtPriceOne(sdk.NewInt(exponentAtPriceOne))
 
-	fundTokens := []string{"1000000uosmo", "1000000uion", "1000000stake"}
-	// get 3 addresses to create positions
+	fundTokens := []string{"100000000uosmo", "100000000uion", "100000000stake"}
+
+	// Get 3 addresses to create positions
 	address1 := node.CreateWalletAndFund("addr1", fundTokens)
 	address2 := node.CreateWalletAndFund("addr2", fundTokens)
 	address3 := node.CreateWalletAndFund("addr3", fundTokens)
 
 	// Create 2 positions for address1: overlap together, overlap with 2 address3 positions
-	addr1PosId := node.CreateConcentratedPosition(address1, "[-1200]", "400", fmt.Sprintf("1000%s", denom0), fmt.Sprintf("1000%s", denom1), 0, 0, poolID)
-	node.CreateConcentratedPosition(address1, "[-400]", "400", fmt.Sprintf("1000%s", denom0), fmt.Sprintf("1000%s", denom1), 0, 0, poolID)
+	node.CreateConcentratedPosition(address1, "[-1200]", "400", fmt.Sprintf("10000000%s", denom0), fmt.Sprintf("10000000%s", denom1), 0, 0, poolID)
+	node.CreateConcentratedPosition(address1, "[-400]", "1200", fmt.Sprintf("10000000%s", denom0), fmt.Sprintf("10000000%s", denom1), 0, 0, poolID)
 
 	// Create 1 position for address2: does not overlap with anything, ends at maximum
-	addr2PosId := node.CreateConcentratedPosition(address2, "2200", fmt.Sprintf("%d", maxTick), fmt.Sprintf("1000%s", denom0), fmt.Sprintf("1000%s", denom1), 0, 0, poolID)
+	node.CreateConcentratedPosition(address2, "2200", fmt.Sprintf("%d", maxTick), fmt.Sprintf("10000000%s", denom0), fmt.Sprintf("10000000%s", denom1), 0, 0, poolID)
 
 	// Create 2 positions for address3: overlap together, overlap with 2 address1 positions, one position starts from minimum
-	addr3PosId := node.CreateConcentratedPosition(address3, "[-1600]", "[-200]", fmt.Sprintf("1000%s", denom0), fmt.Sprintf("1000%s", denom1), 0, 0, poolID)
-	node.CreateConcentratedPosition(address3, fmt.Sprintf("[%d]", minTick), "1400", fmt.Sprintf("1000%s", denom0), fmt.Sprintf("1000%s", denom1), 0, 0, poolID)
+	node.CreateConcentratedPosition(address3, "[-1600]", "[-200]", fmt.Sprintf("10000000%s", denom0), fmt.Sprintf("10000000%s", denom1), 0, 0, poolID)
+	node.CreateConcentratedPosition(address3, fmt.Sprintf("[%d]", minTick), "1400", fmt.Sprintf("10000000%s", denom0), fmt.Sprintf("10000000%s", denom1), 0, 0, poolID)
 
-	// get newly created positions
+	// Get newly created positions
 	positionsAddress1 := node.QueryConcentratedPositions(address1)
 	positionsAddress2 := node.QueryConcentratedPositions(address2)
 	positionsAddress3 := node.QueryConcentratedPositions(address3)
 
-	// assert number of positions per address
+	concentratedPool = s.updatedPool(node, poolID)
+
+	// Assert number of positions per address
 	s.Require().Equal(len(positionsAddress1), 2)
 	s.Require().Equal(len(positionsAddress2), 1)
 	s.Require().Equal(len(positionsAddress3), 2)
 
-	// Assert returned positions:
-	validateCLPosition := func(position model.Position, poolId uint64, lowerTick, upperTick int64) {
-		s.Require().Equal(position.PoolId, poolId)
-		s.Require().Equal(position.LowerTick, int64(lowerTick))
-		s.Require().Equal(position.UpperTick, int64(upperTick))
-	}
-
-	// assert positions for address1
+	// Assert positions for address1
 	addr1position1 := positionsAddress1[0].Position
 	addr1position2 := positionsAddress1[1].Position
-	// first position first address
-	validateCLPosition(addr1position1, poolID, -1200, 400)
-	// second position second address
-	validateCLPosition(addr1position2, poolID, -400, 400)
+	// First position first address
+	s.validateCLPosition(addr1position1, poolID, -1200, 400)
+	// Second position second address
+	s.validateCLPosition(addr1position2, poolID, -400, 1200)
 
-	// assert positions for address2
+	// Assert positions for address2
 	addr2position1 := positionsAddress2[0].Position
-	// first position second address
-	validateCLPosition(addr2position1, poolID, 2200, maxTick)
+	// First position second address
+	s.validateCLPosition(addr2position1, poolID, 2200, maxTick)
 
-	// assert positions for address3
+	// Assert positions for address3
 	addr3position1 := positionsAddress3[0].Position
 	addr3position2 := positionsAddress3[1].Position
-	// first position third address
-	validateCLPosition(addr3position1, poolID, -1600, -200)
-	// second position third address
-	validateCLPosition(addr3position2, poolID, minTick, 1400)
+	// First position third address
+	s.validateCLPosition(addr3position1, poolID, -1600, -200)
+	// Second position third address
+	s.validateCLPosition(addr3position2, poolID, minTick, 1400)
+
+	// Collect Fees
+
+	var (
+		// feeGrowthGlobal is a variable for tracking global fee growth
+		feeGrowthGlobal = sdk.ZeroDec()
+		outMinAmt       = "1"
+	)
+
+	// Swap 1
+	// Not crossing initialized ticks => performed in one swap step
+	// Swap affects 3 positions: both that address1 has and one of address3's positions
+	// Asserts that fees are correctly collected for non cross-tick swaps
+	var (
+		// Swap parameters
+		uosmoInDec_Swap1 = sdk.NewDec(3465198)
+		uosmoIn_Swap1    = fmt.Sprintf("%suosmo", uosmoInDec_Swap1.String())
+	)
+	// Perform swap (not crossing initialized ticks)
+	node.SwapExactAmountIn(uosmoIn_Swap1, outMinAmt, fmt.Sprintf("%d", poolID), denom0, initialization.ValidatorWalletName)
+	// Calculate and track global fee growth for swap 1
+	feeGrowthGlobal.AddMut(calculateFeeGrowthGlobal(uosmoInDec_Swap1, swapFeeDec, concentratedPool.GetLiquidity()))
+
+	// Update pool and track liquidity and sqrt price
+	liquidityBeforeSwap := concentratedPool.GetLiquidity()
+	sqrtPriceBeforeSwap := concentratedPool.GetCurrentSqrtPrice()
+
+	concentratedPool = s.updatedPool(node, poolID)
+
+	liquidityAfterSwap := concentratedPool.GetLiquidity()
+	sqrtPriceAfterSwap := concentratedPool.GetCurrentSqrtPrice()
+
+	// Assert swaps don't change pool's liquidity amount
+	s.Require().Equal(liquidityAfterSwap, liquidityBeforeSwap)
+
+	// Assert current sqrt price
+	inAmountSubFee := uosmoInDec_Swap1.Mul(sdk.OneDec().Sub(swapFeeDec))
+	expectedSqrtPriceDelta := inAmountSubFee.QuoTruncate(concentratedPool.GetLiquidity()) // Δ(sqrtPrice) = Δy / L
+	expectedSqrtPrice := sqrtPriceBeforeSwap.Add(expectedSqrtPriceDelta)
+
+	s.Require().Equal(expectedSqrtPrice, sqrtPriceAfterSwap)
+
+	// Collect Fees: Swap 1
+
+	// Track balances for address1 position1
+	addr1BalancesBefore := s.addrBalance(node, address1)
+	node.CollectFees(address1, fmt.Sprint(positionsAddress1[0].Position.PositionId))
+	addr1BalancesAfter := s.addrBalance(node, address1)
+
+	// Assert that the balance changed only for tokenIn (uosmo)
+	s.assertBalancesInvariants(addr1BalancesBefore, addr1BalancesAfter, false, true)
+
+	// Assert Balances: Swap 1
+
+	// Calculate uncollected fees for address1 position1
+	feesUncollectedAddress1Position1_Swap1 := calculateUncollectedFees(
+		positionsAddress1[0].Position.Liquidity,
+		sdk.ZeroDec(), // no growth below
+		sdk.ZeroDec(), // no growth above
+		sdk.ZeroDec(), // no feeGrowthInsideLast - it is the first swap
+		feeGrowthGlobal,
+	)
+
+	// Assert
+	s.Require().Equal(
+		addr1BalancesBefore.AmountOf("uosmo").Add(feesUncollectedAddress1Position1_Swap1.TruncateInt()),
+		addr1BalancesAfter.AmountOf("uosmo"),
+	)
+
+	// Swap 2
+	//
+	// Cross-tick swap:
+	// * Part of swap happens in range of liquidity of 3 positions: both of address1 and one for address3 (until tick 400 - upper tick of address1 position1)
+	// * Another part happens in range of liquidity of 2 positions: one from address1 and address3
+	//
+	// Asserts:
+	// * Net liquidity is kicked out when crossing initialized tick
+	// * Liquidity of position that was kicked out after first swap step does not earn rewards from second swap step
+	// * Uncollected fees from multiple swaps are correctly summed up and collected
+
+	// tickOffset is a tick index after the next initialized tick to which this swap needs to move the current price
+	tickOffset := sdk.NewInt(3)
+	sqrtPriceBeforeSwap = concentratedPool.GetCurrentSqrtPrice()
+	liquidityBeforeSwap = concentratedPool.GetLiquidity()
+	nextInitTick := sdk.NewInt(400) // address1 position1's upper tick
+
+	// Calculate sqrtPrice after and at the next initialized tick (upperTick of address1 position1 - 400)
+	sqrtPriceAfterNextInitializedTick, err := cl.TickToSqrtPrice(nextInitTick.Add(tickOffset), sdk.NewInt(exponentAtPriceOne))
+	s.Require().NoError(err)
+	sqrtPriceAtNextInitializedTick, err := cl.TickToSqrtPrice(nextInitTick, sdk.NewInt(exponentAtPriceOne))
+	s.Require().NoError(err)
+
+	// Calculate Δ(sqrtPrice):
+	// deltaSqrtPriceAfterNextInitializedTick = ΔsqrtP(403) - ΔsqrtP(400)
+	// deltaSqrtPriceAtNextInitializedTick = ΔsqrtP(400) - ΔsqrtP(currentTick)
+	deltaSqrtPriceAfterNextInitializedTick := sqrtPriceAfterNextInitializedTick.Sub(sqrtPriceAtNextInitializedTick)
+	deltaSqrtPriceAtNextInitializedTick := sqrtPriceAtNextInitializedTick.Sub(sqrtPriceBeforeSwap)
+
+	// Calculate the amount of osmo required to:
+	// * amountInToGetToTickAfterInitialized - move price from next initialized tick (400) to destination tick (400 + tickOffset)
+	// * amountInToGetToNextInitTick - move price from current tick to next initialized tick
+	// Formula is as follows:
+	// Δy = L * Δ(sqrtPrice)
+	amountInToGetToTickAfterInitialized := deltaSqrtPriceAfterNextInitializedTick.Mul(liquidityBeforeSwap.Sub(positionsAddress1[0].Position.Liquidity))
+	amountInToGetToNextInitTick := deltaSqrtPriceAtNextInitializedTick.Mul(liquidityBeforeSwap)
+
+	var (
+		// Swap parameters
+
+		// uosmoInDec_Swap2_NoFee is calculated such that swapping this amount (not considering fee) moves the price over the next initialized tick
+		uosmoInDec_Swap2_NoFee = amountInToGetToNextInitTick.Add(amountInToGetToTickAfterInitialized)
+		uosmoInDec_Swap2       = uosmoInDec_Swap2_NoFee.Quo(sdk.OneDec().Sub(swapFeeDec)).TruncateDec() // account for swap fee of 1%
+		uosmoIn_Swap2          = fmt.Sprintf("%suosmo", uosmoInDec_Swap2.String())
+
+		feeGrowthGlobal_Swap1 = feeGrowthGlobal.Clone()
+	)
+	// Perform a swap
+	node.SwapExactAmountIn(uosmoIn_Swap2, outMinAmt, fmt.Sprintf("%d", poolID), denom0, initialization.ValidatorWalletName)
+
+	// Calculate the amount of liquidity of the position that was kicked out during swap (address1 position1)
+	liquidityOfKickedOutPosition := positionsAddress1[0].Position.Liquidity
+
+	// Update pool and track pool's liquidity
+	concentratedPool = s.updatedPool(node, poolID)
+
+	liquidityAfterSwap = concentratedPool.GetLiquidity()
+
+	// Assert that net liquidity of kicked out position was successfully removed from current pool's liquidity
+	s.Require().Equal(liquidityBeforeSwap.Sub(liquidityOfKickedOutPosition), liquidityAfterSwap)
+
+	// Collect fees: Swap 2
+
+	// Calculate fee charges per each step
+
+	// Step1: amountIn is uosmo tokens that are swapped + uosmo tokens that are paid for fee
+	// hasReachedTarget in SwapStep is true, hence, to find fees, calculate:
+	// feeCharge = amountIn * swapFee / (1 - swapFee)
+	feeCharge_Swap2_Step1 := amountInToGetToNextInitTick.Mul(swapFeeDec).Quo(sdk.OneDec().Sub(swapFeeDec))
+
+	// Step2: hasReachedTarget in SwapStep is false (nextTick is 1200), hence, to find fees, calculate:
+	// feeCharge = amountRemaining - amountOne
+	amountRemainingAfterStep1 := uosmoInDec_Swap2.Sub(amountInToGetToNextInitTick).Sub(feeCharge_Swap2_Step1)
+	feeCharge_Swap2_Step2 := amountRemainingAfterStep1.Sub(amountInToGetToTickAfterInitialized)
+
+	// per unit of virtual liquidity
+	feeCharge_Swap2_Step1.QuoMut(liquidityBeforeSwap)
+	feeCharge_Swap2_Step2.QuoMut(liquidityAfterSwap)
+
+	// Update feeGrowthGlobal
+	feeGrowthGlobal.AddMut(feeCharge_Swap2_Step1.Add(feeCharge_Swap2_Step2))
+
+	// Assert Balances: Swap 2
+
+	// Assert that address1 position1 earned fees only from first swap step
+
+	// Track balances for address1 position1
+	addr1BalancesBefore = s.addrBalance(node, address1)
+	node.CollectFees(address1, fmt.Sprint(positionsAddress1[0].Position.PositionId))
+	addr1BalancesAfter = s.addrBalance(node, address1)
+
+	// Assert that the balance changed only for tokenIn (uosmo)
+	s.assertBalancesInvariants(addr1BalancesBefore, addr1BalancesAfter, false, true)
+
+	// Calculate uncollected fees for position, which liquidity will only be live part of the swap
+	feesUncollectedAddress1Position1_Swap2 := calculateUncollectedFees(
+		positionsAddress1[0].Position.Liquidity,
+		sdk.ZeroDec(),
+		sdk.ZeroDec(),
+		calculateFeeGrowthInside(feeGrowthGlobal_Swap1, sdk.ZeroDec(), sdk.ZeroDec()),
+		feeGrowthGlobal_Swap1.Add(feeCharge_Swap2_Step1), // cannot use feeGrowthGlobal, it was already increased by second swap's step
+	)
+
+	// Assert
+	s.Require().Equal(
+		addr1BalancesBefore.AmountOf("uosmo").Add(feesUncollectedAddress1Position1_Swap2.TruncateInt()),
+		addr1BalancesAfter.AmountOf("uosmo"),
+	)
+
+	// Assert that address3 position2 earned rewards from first and second swaps
+
+	// Track balance off address3 position2: check that position that has not been kicked out earned full rewards
+	addr3BalancesBefore := s.addrBalance(node, address3)
+	node.CollectFees(address3, fmt.Sprint(positionsAddress3[1].Position.PositionId))
+	addr3BalancesAfter := s.addrBalance(node, address3)
+
+	// Calculate uncollected fees for address3 position2 earned from Swap 1
+	feesUncollectedAddress3Position2_Swap1 := calculateUncollectedFees(
+		positionsAddress3[1].Position.Liquidity,
+		sdk.ZeroDec(),
+		sdk.ZeroDec(),
+		sdk.ZeroDec(),
+		feeGrowthGlobal_Swap1,
+	)
+
+	// Calculate uncollected fees for address3 position2 (was active throughout both swap steps): Swap2
+	feesUncollectedAddress3Position2_Swap2 := calculateUncollectedFees(
+		positionsAddress3[1].Position.Liquidity,
+		sdk.ZeroDec(),
+		sdk.ZeroDec(),
+		calculateFeeGrowthInside(feeGrowthGlobal_Swap1, sdk.ZeroDec(), sdk.ZeroDec()),
+		feeGrowthGlobal,
+	)
+
+	// Total fees earned by address3 position2 from 2 swaps
+	totalUncollectedFeesAddress3Position2 := feesUncollectedAddress3Position2_Swap1.Add(feesUncollectedAddress3Position2_Swap2)
+
+	// Assert
+	s.Require().Equal(
+		addr3BalancesBefore.AmountOf("uosmo").Add(totalUncollectedFeesAddress3Position2.TruncateInt()),
+		addr3BalancesAfter.AmountOf("uosmo"),
+	)
+
+	// Swap 3
+	// Asserts:
+	// * swapping amountZero for amountOne works correctly
+	// * liquidity of positions that come in range are correctly kicked in
+
+	// tickOffset is a tick index after the next initialized tick to which this swap needs to move the current price
+	tickOffset = sdk.NewInt(3)
+	sqrtPriceBeforeSwap = concentratedPool.GetCurrentSqrtPrice()
+	liquidityBeforeSwap = concentratedPool.GetLiquidity()
+	nextInitTick = sdk.NewInt(400)
+
+	// Calculate amount required to get to
+	// 1) next initialized tick
+	// 2) tick below next initialized (-3)
+	// Using: CalcAmount0Delta = liquidity * ((sqrtPriceB - sqrtPriceA) / (sqrtPriceB * sqrtPriceA))
+
+	// Calculate sqrtPrice after and at the next initialized tick (which is upperTick of address1 position1 - 400)
+	sqrtPricebBelowNextInitializedTick, err := cl.TickToSqrtPrice(nextInitTick.Sub(tickOffset), sdk.NewInt(exponentAtPriceOne))
+	s.Require().NoError(err)
+	sqrtPriceAtNextInitializedTick, err = cl.TickToSqrtPrice(nextInitTick, sdk.NewInt(exponentAtPriceOne))
+	s.Require().NoError(err)
+
+	// Calculate numerators
+	numeratorBelowNextInitializedTick := sqrtPriceAtNextInitializedTick.Sub(sqrtPricebBelowNextInitializedTick)
+	numeratorNextInitializedTick := sqrtPriceBeforeSwap.Sub(sqrtPriceAtNextInitializedTick)
+
+	// Calculate denominators
+	denominatorBelowNextInitializedTick := sqrtPriceAtNextInitializedTick.Mul(sqrtPricebBelowNextInitializedTick)
+	denominatorNextInitializedTick := sqrtPriceBeforeSwap.Mul(sqrtPriceAtNextInitializedTick)
+
+	// Calculate fractions
+	fractionBelowNextInitializedTick := numeratorBelowNextInitializedTick.Quo(denominatorBelowNextInitializedTick)
+	fractionAtNextInitializedTick := numeratorNextInitializedTick.Quo(denominatorNextInitializedTick)
+
+	// Calculate amounts of uionIn needed
+	amountInToGetToTickBelowInitialized := liquidityBeforeSwap.Add(positionsAddress1[0].Position.Liquidity).Mul(fractionBelowNextInitializedTick)
+	amountInToGetToNextInitTick = liquidityBeforeSwap.Mul(fractionAtNextInitializedTick)
 
-	// Withdraw Position:
 	var (
+		// Swap parameters
+		uionInDec_Swap3_NoFee = amountInToGetToNextInitTick.Add(amountInToGetToTickBelowInitialized)  // amount of uion to move price from current to desired (not considering swapFee)
+		uionInDec_Swap3       = uionInDec_Swap3_NoFee.Quo(sdk.OneDec().Sub(swapFeeDec)).TruncateDec() // consider swapFee
+		uionIn_Swap3          = fmt.Sprintf("%suion", uionInDec_Swap3.String())
+
+		// Save variables from previous swaps
+		feeGrowthGlobal_Swap2                = feeGrowthGlobal.Clone()
+		feeGrowthInsideAddress1Position1Last = feeGrowthGlobal_Swap1.Add(feeCharge_Swap2_Step1)
+	)
+	// Collect fees for address1 position1 to avoid overhead computations (swap2 already asserted fees are aggregated correctly from multiple swaps)
+	node.CollectFees(address1, fmt.Sprint(positionsAddress1[0].Position.PositionId))
+
+	// Perform a swap
+	node.SwapExactAmountIn(uionIn_Swap3, outMinAmt, fmt.Sprintf("%d", poolID), denom1, initialization.ValidatorWalletName)
+
+	// Assert liquidity of kicked in position was successfully added to the pool
+	concentratedPool = s.updatedPool(node, poolID)
+
+	liquidityAfterSwap = concentratedPool.GetLiquidity()
+	s.Require().Equal(liquidityBeforeSwap.Add(positionsAddress1[0].Position.Liquidity), liquidityAfterSwap)
+
+	// Track balance of address1
+	addr1BalancesBefore = s.addrBalance(node, address1)
+	node.CollectFees(address1, fmt.Sprint(positionsAddress1[0].Position.PositionId))
+	addr1BalancesAfter = s.addrBalance(node, address1)
+
+	// Assert that the balance changed only for tokenIn (uion)
+	s.assertBalancesInvariants(addr1BalancesBefore, addr1BalancesAfter, true, false)
+
+	// Assert the amount of collected fees:
+
+	// Step1: amountIn is uion tokens that are swapped + uion tokens that are paid for fee
+	// hasReachedTarget in SwapStep is true, hence, to find fees, calculate:
+	// feeCharge = amountIn * swapFee / (1 - swapFee)
+	feeCharge_Swap3_Step1 := amountInToGetToNextInitTick.Mul(swapFeeDec).Quo(sdk.OneDec().Sub(swapFeeDec))
+
+	// Step2: hasReachedTarget in SwapStep is false (next initialized tick is -200), hence, to find fees, calculate:
+	// feeCharge = amountRemaining - amountZero
+	amountRemainingAfterStep1 = uionInDec_Swap3.Sub(amountInToGetToNextInitTick).Sub(feeCharge_Swap3_Step1)
+	feeCharge_Swap3_Step2 := amountRemainingAfterStep1.Sub(amountInToGetToTickBelowInitialized)
+
+	// Per unit of virtual liquidity
+	feeCharge_Swap3_Step1.QuoMut(liquidityBeforeSwap)
+	feeCharge_Swap3_Step2.QuoMut(liquidityAfterSwap)
+
+	// Update feeGrowthGlobal
+	feeGrowthGlobal.AddMut(feeCharge_Swap3_Step1.Add(feeCharge_Swap3_Step2))
+
+	// Assert position that was active throughout second swap step (address1 position1) only earned fees for this step:
+
+	// Only collects fees for second swap step
+	feesUncollectedAddress1Position1_Swap3 := calculateUncollectedFees(
+		positionsAddress1[0].Position.Liquidity,
+		sdk.ZeroDec(),
+		feeCharge_Swap2_Step2.Add(feeCharge_Swap3_Step1), // fees acquired by swap2 step2 and swap3 step1 (steps happened above upper tick of this position)
+		feeGrowthInsideAddress1Position1Last,             // feeGrowthInside from first and second swaps
+		feeGrowthGlobal,
+	)
+
+	// Assert
+	s.Require().Equal(
+		addr1BalancesBefore.AmountOf("uion").Add(feesUncollectedAddress1Position1_Swap3.TruncateInt()),
+		addr1BalancesAfter.AmountOf("uion"),
+	)
+
+	// Assert position that was active thoughout the whole swap:
+
+	// Track balance of address3
+	addr3BalancesBefore = s.addrBalance(node, address3)
+	node.CollectFees(address3, fmt.Sprint(positionsAddress3[1].Position.PositionId))
+	addr3BalancesAfter = s.addrBalance(node, address3)
+
+	// Assert that the balance changed only for tokenIn (uion)
+	s.assertBalancesInvariants(addr3BalancesBefore, addr3BalancesAfter, true, false)
+
+	// Was active throughout the whole swap, collects fees from 2 steps
+
+	// Step 1
+	feesUncollectedAddress3Position2_Swap3_Step1 := calculateUncollectedFees(
+		positionsAddress3[1].Position.Liquidity,
+		sdk.ZeroDec(), // no growth below
+		sdk.ZeroDec(), // no growth above
+		calculateFeeGrowthInside(feeGrowthGlobal_Swap2, sdk.ZeroDec(), sdk.ZeroDec()), // snapshot of fee growth at swap 2
+		feeGrowthGlobal.Sub(feeCharge_Swap3_Step2),                                    // step 1 hasn't earned fees from step 2
+	)
+
+	// Step 2
+	feesUncollectedAddress3Position2_Swap3_Step2 := calculateUncollectedFees(
+		positionsAddress3[1].Position.Liquidity,
+		sdk.ZeroDec(), // no growth below
+		sdk.ZeroDec(), // no growth above
+		calculateFeeGrowthInside(feeGrowthGlobal_Swap2, sdk.ZeroDec(), sdk.ZeroDec()), // snapshot of fee growth at swap 2
+		feeGrowthGlobal.Sub(feeCharge_Swap3_Step1),                                    // step 2 hasn't earned fees from step 1
+	)
+
+	// Calculate total fees acquired by address3 position2 from all swap steps
+	totalUncollectedFeesAddress3Position2 = feesUncollectedAddress3Position2_Swap3_Step1.Add(feesUncollectedAddress3Position2_Swap3_Step2)
+
+	// Assert
+	s.Require().Equal(
+		addr3BalancesBefore.AmountOf("uion").Add(totalUncollectedFeesAddress3Position2.TruncateInt()),
+		addr3BalancesAfter.AmountOf("uion"),
+	)
+
+	// Collect Fees: Sanity Checks
+
+	// Assert that positions, which were not included in swaps, were not affected
+
+	// Address3 Position1: [-1600; -200]
+	addr3BalancesBefore = s.addrBalance(node, address3)
+	node.CollectFees(address3, fmt.Sprint(positionsAddress3[0].Position.PositionId))
+	addr3BalancesAfter = s.addrBalance(node, address3)
+
+	// Assert that balances did not change for any token
+	s.assertBalancesInvariants(addr3BalancesBefore, addr3BalancesAfter, true, true)
+
+	// Address2's only position: [2200; 3420]
+	addr2BalancesBefore := s.addrBalance(node, address2)
+	node.CollectFees(address2, fmt.Sprint(positionsAddress2[0].Position.PositionId))
+	addr2BalancesAfter := s.addrBalance(node, address2)
+
+	// Assert the balances did not change for every token
+	s.assertBalancesInvariants(addr2BalancesBefore, addr2BalancesAfter, true, true)
+
+	// Withdraw Position
+
+	var (
+		// Withdraw Position parameters
 		defaultLiquidityRemoval string = "1000"
 	)
 
@@ -285,21 +654,21 @@ func (s *IntegrationTestSuite) TestConcentratedLiquidity() {
 	// Assert removing some liquidity
 	// address1: check removing some amount of liquidity
 	address1position1liquidityBefore := positionsAddress1[0].Position.Liquidity
-	node.WithdrawPosition(address1, defaultLiquidityRemoval, addr1PosId)
+	node.WithdrawPosition(address1, defaultLiquidityRemoval, positionsAddress1[0].Position.PositionId)
 	// assert
 	positionsAddress1 = node.QueryConcentratedPositions(address1)
 	s.Require().Equal(address1position1liquidityBefore, positionsAddress1[0].Position.Liquidity.Add(sdk.MustNewDecFromStr(defaultLiquidityRemoval)))
 
 	// address2: check removing some amount of liquidity
 	address2position1liquidityBefore := positionsAddress2[0].Position.Liquidity
-	node.WithdrawPosition(address2, defaultLiquidityRemoval, addr2PosId)
+	node.WithdrawPosition(address2, defaultLiquidityRemoval, positionsAddress2[0].Position.PositionId)
 	// assert
 	positionsAddress2 = node.QueryConcentratedPositions(address2)
 	s.Require().Equal(address2position1liquidityBefore, positionsAddress2[0].Position.Liquidity.Add(sdk.MustNewDecFromStr(defaultLiquidityRemoval)))
 
 	// address3: check removing some amount of liquidity
 	address3position1liquidityBefore := positionsAddress3[0].Position.Liquidity
-	node.WithdrawPosition(address3, defaultLiquidityRemoval, addr3PosId)
+	node.WithdrawPosition(address3, defaultLiquidityRemoval, positionsAddress3[0].Position.PositionId)
 	// assert
 	positionsAddress3 = node.QueryConcentratedPositions(address3)
 	s.Require().Equal(address3position1liquidityBefore, positionsAddress3[0].Position.Liquidity.Add(sdk.MustNewDecFromStr(defaultLiquidityRemoval)))
@@ -307,16 +676,15 @@ func (s *IntegrationTestSuite) TestConcentratedLiquidity() {
 	// Assert removing all liquidity
 	// address2: no more positions left
 	allLiquidityAddress2Position1 := positionsAddress2[0].Position.Liquidity
-	node.WithdrawPosition(address2, allLiquidityAddress2Position1.String(), addr2PosId)
+	node.WithdrawPosition(address2, allLiquidityAddress2Position1.String(), positionsAddress2[0].Position.PositionId)
 	positionsAddress2 = node.QueryConcentratedPositions(address2)
 	s.Require().Empty(positionsAddress2)
 
 	// address1: one position left
 	allLiquidityAddress1Position1 := positionsAddress1[0].Position.Liquidity
-	node.WithdrawPosition(address1, allLiquidityAddress1Position1.String(), addr1PosId)
+	node.WithdrawPosition(address1, allLiquidityAddress1Position1.String(), positionsAddress1[0].Position.PositionId)
 	positionsAddress1 = node.QueryConcentratedPositions(address1)
 	s.Require().Equal(len(positionsAddress1), 1)
-
 }
 
 func (s *IntegrationTestSuite) TestStableSwapPostUpgrade() {
diff --git a/tests/e2e/helpers_e2e_test.go b/tests/e2e/helpers_e2e_test.go
new file mode 100644
index 000000000..caaadd081
--- /dev/null
+++ b/tests/e2e/helpers_e2e_test.go
@@ -0,0 +1,89 @@
+package e2e
+
+import (
+	sdk "github.com/cosmos/cosmos-sdk/types"
+
+	"github.com/osmosis-labs/osmosis/v15/tests/e2e/configurer/chain"
+	"github.com/osmosis-labs/osmosis/v15/x/concentrated-liquidity/model"
+	"github.com/osmosis-labs/osmosis/v15/x/concentrated-liquidity/types"
+)
+
+var (
+	defaultFeePerTx = sdk.NewInt(1000)
+)
+
+// calculateFeeGrowthGlobal calculates fee growth global per unit of virtual liquidity based on swap parameters:
+// amountIn - amount being swapped
+// swapFee - pool's swap fee
+// poolLiquidity - current pool liquidity
+func calculateFeeGrowthGlobal(amountIn, swapFee, poolLiquidity sdk.Dec) sdk.Dec {
+	// First we get total fee charge for the swap (ΔY * swapFee)
+	feeChargeTotal := amountIn.Mul(swapFee)
+
+	// Calculating fee growth global (dividing by pool liquidity to find fee growth per unit of virtual liquidity)
+	feeGrowthGlobal := feeChargeTotal.Quo(poolLiquidity)
+	return feeGrowthGlobal
+}
+
+// calculateFeeGrowthInside calculates fee growth inside range per unit of virtual liquidity
+// feeGrowthGlobal - global fee growth per unit of virtual liquidity
+// feeGrowthBelow - fee growth below lower tick
+// feeGrowthAbove - fee growth above upper tick
+// Formula: feeGrowthGlobal - feeGrowthBelowLowerTick - feeGrowthAboveUpperTick
+func calculateFeeGrowthInside(feeGrowthGlobal, feeGrowthBelow, feeGrowthAbove sdk.Dec) sdk.Dec {
+	return feeGrowthGlobal.Sub(feeGrowthBelow).Sub(feeGrowthAbove)
+}
+
+// Assert balances that are not affected by swap:
+// * same amount of `stake` in balancesBefore and balancesAfter
+// * amount of `e2e-default-feetoken` dropped by 1000 (default amount for fee per tx)
+// * depending on `assertUosmoBalanceIsConstant` and `assertUionBalanceIsConstant` parameters, check that those balances have also not been changed
+func (s *IntegrationTestSuite) assertBalancesInvariants(balancesBefore, balancesAfter sdk.Coins, assertUosmoBalanceIsConstant, assertUionBalanceIsConstant bool) {
+	s.Require().True(balancesAfter.AmountOf("stake").Equal(balancesBefore.AmountOf("stake")))
+	s.Require().True(balancesAfter.AmountOf("e2e-default-feetoken").Equal(balancesBefore.AmountOf("e2e-default-feetoken").Sub(defaultFeePerTx)))
+	if assertUionBalanceIsConstant {
+		s.Require().True(balancesAfter.AmountOf("uion").Equal(balancesBefore.AmountOf("uion")))
+	}
+	if assertUosmoBalanceIsConstant {
+		s.Require().True(balancesAfter.AmountOf("uosmo").Equal(balancesBefore.AmountOf("uosmo")))
+	}
+}
+
+// Get balances for address
+func (s *IntegrationTestSuite) addrBalance(node *chain.NodeConfig, address string) sdk.Coins {
+	addrBalances, err := node.QueryBalances(address)
+	s.Require().NoError(err)
+	return addrBalances
+}
+
+// Helper function for calculating uncollected fees since the time that feeGrowthInsideLast corresponds to
+// positionLiquidity - current position liquidity
+// feeGrowthBelow - fee growth below lower tick
+// feeGrowthAbove - fee growth above upper tick
+// feeGrowthInsideLast - amount of fee growth inside range at the time from which we want to calculate the amount of uncollected fees
+// feeGrowthGlobal - variable for tracking global fee growth
+func calculateUncollectedFees(positionLiquidity, feeGrowthBelow, feeGrowthAbove, feeGrowthInsideLast sdk.Dec, feeGrowthGlobal sdk.Dec) sdk.Dec {
+	// Calculating fee growth inside range [-1200; 400]
+	feeGrowthInside := calculateFeeGrowthInside(feeGrowthGlobal, feeGrowthBelow, feeGrowthAbove)
+
+	// Calculating uncollected fees
+	// Formula for finding uncollected fees in time range [t1; t2]:
+	// F_u = position_liquidity * (fee_growth_inside_t2 - fee_growth_inside_t1).
+	feesUncollected := positionLiquidity.Mul(feeGrowthInside.Sub(feeGrowthInsideLast))
+
+	return feesUncollected.TruncateDec()
+}
+
+// Get current (updated) pool
+func (s *IntegrationTestSuite) updatedPool(node *chain.NodeConfig, poolId uint64) types.ConcentratedPoolExtension {
+	concentratedPool, err := node.QueryConcentratedPool(poolId)
+	s.Require().NoError(err)
+	return concentratedPool
+}
+
+// Assert returned positions:
+func (s *IntegrationTestSuite) validateCLPosition(position model.Position, poolId uint64, lowerTick, upperTick int64) {
+	s.Require().Equal(position.PoolId, poolId)
+	s.Require().Equal(position.LowerTick, int64(lowerTick))
+	s.Require().Equal(position.UpperTick, int64(upperTick))
+}
diff --git a/tests/localosmosis/README.md b/tests/localosmosis/README.md
index 3ac706759..31461acd8 100644
--- a/tests/localosmosis/README.md
+++ b/tests/localosmosis/README.md
@@ -265,7 +265,7 @@ services:
     #     context: ../../
     #     dockerfile: Dockerfile
     #     args:
-    #     RUNNER_IMAGE: alpine:3.16
+    #     RUNNER_IMAGE: alpine:3.17
     #     GO_VERSION: 1.19
 ```
 
diff --git a/tests/localosmosis/docker-compose.yml b/tests/localosmosis/docker-compose.yml
index 6c10554a2..c4fb2de3d 100644
--- a/tests/localosmosis/docker-compose.yml
+++ b/tests/localosmosis/docker-compose.yml
@@ -8,7 +8,7 @@ services:
       context: ../../
       dockerfile: Dockerfile
       args:
-        RUNNER_IMAGE: alpine:3.16
+        RUNNER_IMAGE: alpine:3.17
         GO_VERSION: 1.19
     volumes:
       - ./scripts/nativeDenomPoolA.json:/osmosis/nativeDenomPoolA.json
diff --git a/tests/localosmosis/scripts/nativeDenomPoolA.json b/tests/localosmosis/scripts/nativeDenomPoolA.json
index eacbfde24..9a0c2bad7 100644
--- a/tests/localosmosis/scripts/nativeDenomPoolA.json
+++ b/tests/localosmosis/scripts/nativeDenomPoolA.json
@@ -2,6 +2,6 @@
     "weights": "5uosmo,5stake",
     "initial-deposit": "100000000000uosmo,100000000000stake",
     "swap-fee": "0.01",
-    "exit-fee": "0.01",
+    "exit-fee": "0.00",
     "future-governor": ""
 }
diff --git a/tests/localosmosis/scripts/nativeDenomPoolB.json b/tests/localosmosis/scripts/nativeDenomPoolB.json
index 59e24a533..8ac613bb7 100644
--- a/tests/localosmosis/scripts/nativeDenomPoolB.json
+++ b/tests/localosmosis/scripts/nativeDenomPoolB.json
@@ -2,6 +2,6 @@
     "weights": "5uosmo,5uion",
     "initial-deposit": "100000000000uosmo,100000000000uion",
     "swap-fee": "0.01",
-    "exit-fee": "0.01",
+    "exit-fee": "0.00",
     "future-governor": ""
 }
diff --git a/tests/localosmosis/scripts/nativeDenomThreeAssetPool.json b/tests/localosmosis/scripts/nativeDenomThreeAssetPool.json
index 10cbc4ada..31e2804bf 100644
--- a/tests/localosmosis/scripts/nativeDenomThreeAssetPool.json
+++ b/tests/localosmosis/scripts/nativeDenomThreeAssetPool.json
@@ -2,6 +2,6 @@
     "weights": "5stake,5uion,5uosmo",
     "initial-deposit": "100000000000stake,10000000000uion,200000000000uosmo",
     "swap-fee": "0.01",
-    "exit-fee": "0.01",
+    "exit-fee": "0.00",
     "future-governor": ""
 }
diff --git a/tests/localosmosis/scripts/setup.sh b/tests/localosmosis/scripts/setup.sh
index a367fda70..2646f7fdd 100755
--- a/tests/localosmosis/scripts/setup.sh
+++ b/tests/localosmosis/scripts/setup.sh
@@ -154,7 +154,7 @@ create_concentrated_pool_positions () {
     COUNTER=0
     # Loop through each set of parameters in the array
     for param in "$@"; do
-        run_with_retries "osmosisd tx concentratedliquidity create-position $param 5000000000uosmo 1000000uion 0 0 0 --pool-id=4 --from pools --chain-id=$CHAIN_ID --home $OSMOSIS_HOME --keyring-backend=test -b block --fees 5000uosmo --gas 900000 --yes"
+        run_with_retries "osmosisd tx concentratedliquidity create-position $param 5000000000uosmo 1000000uion 0 0 --pool-id=4 --from pools --chain-id=$CHAIN_ID --home $OSMOSIS_HOME --keyring-backend=test -b block --fees 5000uosmo --gas 900000 --yes"
     done
 }
 
diff --git a/tests/localosmosis/state_export/docker-compose.yml b/tests/localosmosis/state_export/docker-compose.yml
index 220b8e755..6606e3675 100644
--- a/tests/localosmosis/state_export/docker-compose.yml
+++ b/tests/localosmosis/state_export/docker-compose.yml
@@ -8,7 +8,7 @@ services:
       context: ../../../
       dockerfile: Dockerfile
       args:
-        RUNNER_IMAGE: alpine:3.16
+        RUNNER_IMAGE: alpine:3.17
         GO_VERSION: 1.19
     volumes:
       - ./scripts/start.sh:/osmosis/start.sh
diff --git a/tests/localosmosis/state_export/scripts/testnetify.py b/tests/localosmosis/state_export/scripts/testnetify.py
index 3d273047a..0b11e4a89 100755
--- a/tests/localosmosis/state_export/scripts/testnetify.py
+++ b/tests/localosmosis/state_export/scripts/testnetify.py
@@ -27,24 +27,23 @@ config = {
     "epoch_duration": '21600s',
 }
 
-def replace(d, old_value, new_value):
+def replace(obj, old_value, new_value):
     """
-    Replace all the occurences of `old_value` with `new_value`
-    in `d` dictionary
+    Replace all the occurrences of `old_value` with `new_value`
+    in `obj`, which can be a dictionary or a list
     """
-    for k in d.keys():
-        if isinstance(d[k], dict):
-            replace(d[k], old_value, new_value)
-        elif isinstance(d[k], list):
-            for i in range(len(d[k])):
-                if isinstance(d[k][i], dict) or isinstance(d[k][i], list):
-                    replace(d[k][i], old_value, new_value)
-                else:
-                    if d[k][i] == old_value:
-                        d[k][i] = new_value
-        else:
-            if d[k] == old_value:
-                d[k] = new_value
+    if isinstance(obj, dict):
+        for key, value in obj.items():
+            if isinstance(value, (dict, list)):
+                replace(value, old_value, new_value)
+            elif value == old_value:
+                obj[key] = new_value
+    elif isinstance(obj, list):
+        for index, value in enumerate(obj):
+            if isinstance(value, (dict, list)):
+                replace(value, old_value, new_value)
+            elif value == old_value:
+                obj[index] = new_value
 
 def replace_validator(genesis, old_validator, new_validator):
     
diff --git a/tests/localrelayer/docker-compose.yml b/tests/localrelayer/docker-compose.yml
index f21c2c9b8..1aa7d1484 100644
--- a/tests/localrelayer/docker-compose.yml
+++ b/tests/localrelayer/docker-compose.yml
@@ -8,7 +8,7 @@ services:
       context: ../../
       dockerfile: Dockerfile
       args:
-        RUNNER_IMAGE: alpine:3.16
+        RUNNER_IMAGE: alpine:3.17
         GO_VERSION: 1.19
     volumes:
       - ./scripts/setup_chain.sh:/osmosis/setup.sh
@@ -59,7 +59,7 @@ services:
       context: ../../
       dockerfile: Dockerfile
       args:
-        RUNNER_IMAGE: alpine:3.16
+        RUNNER_IMAGE: alpine:3.17
         GO_VERSION: 1.19
     volumes:
       - ./scripts/setup_chain.sh:/osmosis/setup.sh
diff --git a/tests/simulator/osmosis_helper.go b/tests/simulator/osmosis_helper.go
index 652984544..c37df23f1 100644
--- a/tests/simulator/osmosis_helper.go
+++ b/tests/simulator/osmosis_helper.go
@@ -24,7 +24,6 @@ func OsmosisAppCreator(logger log.Logger, db db.DB) simtypes.AppCreator {
 			homepath,
 			legacyInvariantPeriod,
 			emptyAppOptions{},
-			app.GetWasmEnabledProposals(),
 			app.EmptyWasmOpts,
 			baseappOptions...)
 	}
diff --git a/x/concentrated-liquidity/keeper_test.go b/x/concentrated-liquidity/keeper_test.go
index f684087da..9dd4ef5b0 100644
--- a/x/concentrated-liquidity/keeper_test.go
+++ b/x/concentrated-liquidity/keeper_test.go
@@ -33,6 +33,7 @@ var (
 	DefaultZeroSwapFee                             = sdk.ZeroDec()
 	DefaultFeeAccumCoins                           = sdk.NewDecCoins(sdk.NewDecCoin("foo", sdk.NewInt(50)))
 	DefaultPositionId                              = uint64(1)
+	DefaultUnderlyingLockId                        = uint64(0)
 	DefaultJoinTime                                = time.Unix(0, 0)
 	ETH                                            = "eth"
 	DefaultAmt0                                    = sdk.NewInt(1000000)
diff --git a/x/concentrated-liquidity/tick_test.go b/x/concentrated-liquidity/tick_test.go
index 824b52e47..38fab5901 100644
--- a/x/concentrated-liquidity/tick_test.go
+++ b/x/concentrated-liquidity/tick_test.go
@@ -38,7 +38,7 @@ func (s *KeeperTestSuite) TestTickOrdering() {
 	storeKey := sdk.NewKVStoreKey("concentrated_liquidity")
 	tKey := sdk.NewTransientStoreKey("transient_test")
 	s.Ctx = testutil.DefaultContext(storeKey, tKey)
-	s.App.ConcentratedLiquidityKeeper = cl.NewKeeper(s.App.AppCodec(), storeKey, s.App.BankKeeper, s.App.GetSubspace(types.ModuleName))
+	s.App.ConcentratedLiquidityKeeper = cl.NewKeeper(s.App.AppCodec(), storeKey, s.App.BankKeeper, s.App.LockupKeeper, s.App.GetSubspace(types.ModuleName))
 
 	liquidityTicks := []int64{-200, -55, -4, 70, 78, 84, 139, 240, 535}
 	for _, t := range liquidityTicks {
diff --git a/x/pool-incentives/keeper/genesis_test.go b/x/pool-incentives/keeper/genesis_test.go
index 0c58cf2d4..e802199bc 100644
--- a/x/pool-incentives/keeper/genesis_test.go
+++ b/x/pool-incentives/keeper/genesis_test.go
@@ -36,6 +36,20 @@ var (
 				},
 			},
 		},
+		PoolToGauges: &types.PoolToGauges{
+			PoolToGauge: []types.PoolToGauge{
+				{
+					PoolId:   1,
+					GaugeId:  1,
+					Duration: time.Second,
+				},
+				{
+					PoolId:   2,
+					GaugeId:  2,
+					Duration: time.Second,
+				},
+			},
+		},
 	}
 )