Repository: celestiaorg/celestia-app

Issue:
Decrease `UpgradeHeightDelay` on networks
## Context

https://celestia-team.slack.com/archives/C087852KEVC/p1741966964952959

## Problem

Currently the `UpgradeHeightDelay` is 7 days on Arabica, Mocha, and Mainnet Beta. This means it will take more than 3 weeks to deploy a new celestia-app major version across all networks. 

The UpgradeHeightDelay is useful to give some grace period to the 1/6 of voting power that haven't upgraded prior to the activation height. 

```mermaid
graph LR
  A[Create v4.0.0-arabica. Ask validators to upgrade binary & signal for v4] -- Wait until 5/6 voting power has signalled for v4--> B[Submit MsgTryUpgrade]
  B -- Wait UpgradeHeightDelay --> C[v4 activates on Arabica]
```

## Proposal

1. Arabica: decrease `UpgradeHeightDelay` from 7 days to 1 day
2. Mocha: decrease `UpgradeHeightDelay` from 7 days to 2 days
3. ~~Mainnet: decrease `UpgradeHeightDelay` from 7 days to 3 days~~

Note: this is consensus breaking and we're going to release it in a minor release. Nodes must upgrade to a release with this change _prior_ to the upgrade process starting on that network (specifically before the `MsgTryUpgrade` is submitted).

Discussion:
@rootulp: Revised this issue to decrease the upgrade height on all networks. cc: @cmwaters @evan-forbes @adlerjohn 

@cmwaters: Im not opposed to these changes. A week seems a long time even after 5/6 have already voted for the upgrade. Currently we allocate an entire month after the first RC to release a major upgrade which is quite a long duration. Paired with the multiplexer, I think it would be valuable to making major upgrades quicker to roll out @jcstein: I'm in favor of these changes to make our release and upgrade pipeline more efficient@adlerjohn: Also fine with these changes@rootulp: In core/app sprint planning we agreed to decrease the upgrade height delay on Arabica and Mocha but not on Mainnet. I updated the issue description.

Solution patch:
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
index 6ef0382d..4317b839 100644
--- a/.github/workflows/codeql.yml
+++ b/.github/workflows/codeql.yml
@@ -40,11 +40,11 @@ jobs:
 
     steps:
       - name: Checkout repository
-        uses: actions/checkout@v4
+        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2
 
       # Initializes the CodeQL tools for scanning.
       - name: Initialize CodeQL
-        uses: github/codeql-action/init@v2
+        uses: github/codeql-action/init@70df9def86d22bf0ea4e7f8b956e7b92e7c1ea22 #v2.20.7
         with:
           languages: ${{ matrix.language }}
           # If you wish to specify custom queries, you can do so here or in a config file.
@@ -54,7 +54,7 @@ jobs:
           # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
           # queries: security-extended,security-and-quality
 
-      - uses: actions/setup-go@v5
+      - uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b #v5.4.0
         with:
           go-version-file: "go.mod"
 
@@ -63,6 +63,6 @@ jobs:
           make build
 
       - name: Perform CodeQL Analysis
-        uses: github/codeql-action/analyze@v2
+        uses: github/codeql-action/analyze@70df9def86d22bf0ea4e7f8b956e7b92e7c1ea22 #v2.20.7
         with:
           category: "/language:${{matrix.language}}"
diff --git a/.github/workflows/docker-build-publish.yml b/.github/workflows/docker-build-publish.yml
index 8f628ea3..432181e5 100644
--- a/.github/workflows/docker-build-publish.yml
+++ b/.github/workflows/docker-build-publish.yml
@@ -21,7 +21,7 @@ jobs:
     permissions:
       contents: write
       packages: write
-    uses: celestiaorg/.github/.github/workflows/reusable_dockerfile_pipeline.yml@v0.5.0
+    uses: celestiaorg/.github/.github/workflows/reusable_dockerfile_pipeline.yml@45533fc35847a8568deb0d4cae1851a2872f3651 #v0.5.0
     with:
       dockerfile: docker/Dockerfile
       checkout_ref: ${{ github.event.inputs.ref }}
@@ -31,7 +31,7 @@ jobs:
     permissions:
       contents: write
       packages: write
-    uses: celestiaorg/.github/.github/workflows/reusable_dockerfile_pipeline.yml@v0.5.0
+    uses: celestiaorg/.github/.github/workflows/reusable_dockerfile_pipeline.yml@45533fc35847a8568deb0d4cae1851a2872f3651 #v0.5.0
     with:
       dockerfile: docker/txsim/Dockerfile
       packageName: txsim
diff --git a/.github/workflows/github-pages.yml b/.github/workflows/github-pages.yml
index e5ac96dc..ec8c928c 100644
--- a/.github/workflows/github-pages.yml
+++ b/.github/workflows/github-pages.yml
@@ -18,10 +18,10 @@ jobs:
       contents: write
       pull-requests: write
     steps:
-      - uses: actions/checkout@v4
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2
 
       - name: Setup mdBook
-        uses: peaceiris/actions-mdbook@v2
+        uses: peaceiris/actions-mdbook@ee69d230fe19748b7abf22df32acaa93833fad08 #v2.0.0
         with:
           mdbook-version: "0.4.21"
 
@@ -30,7 +30,7 @@ jobs:
 
       - name: Deploy main
         if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
-        uses: peaceiris/actions-gh-pages@v4
+        uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e #v4.0.0
         with:
           github_token: ${{ secrets.GITHUB_TOKEN }}
           publish_dir: ./specs/book
@@ -43,6 +43,6 @@ jobs:
         # because this job will fail for branches from forks.
         # https://github.com/celestiaorg/celestia-app/issues/1506
         if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository
-        uses: rossjrw/pr-preview-action@v1
+        uses: rossjrw/pr-preview-action@df22037db54ab6ee34d3c1e2b8810ac040a530c6 #v1.6.0
         with:
           source-dir: ./specs/book
diff --git a/.github/workflows/goreleaser.yml b/.github/workflows/goreleaser.yml
index 61a91619..f7924b31 100644
--- a/.github/workflows/goreleaser.yml
+++ b/.github/workflows/goreleaser.yml
@@ -10,13 +10,13 @@ jobs:
     if: github.event_name == 'release'
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@v4
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2
         with:
           fetch-depth: 0
       - run: git fetch --force --tags
       - name: Set GORELEASER_CURRENT_TAG in GitHub env
         run: echo "GORELEASER_CURRENT_TAG=${{ github.event.release.tag_name }}" >> $GITHUB_ENV
-      - uses: actions/setup-go@v5
+      - uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b #v5.4.0
         with:
           go-version-file: 'go.mod'
       - name: Create .release-env file
@@ -33,13 +33,13 @@ jobs:
     runs-on: ubuntu-latest
     permissions: write-all
     steps:
-      - uses: actions/checkout@v4
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2
         with:
           fetch-depth: 0
       - run: git fetch --force --tags
       - name: Set GORELEASER_CURRENT_TAG in GitHub env
         run: echo "GORELEASER_CURRENT_TAG=${{ github.event.release.tag_name }}" >> $GITHUB_ENV
-      - uses: actions/setup-go@v5
+      - uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b #v5.4.0
         with:
           go-version-file: 'go.mod'
       - name: Create .release-env file
diff --git a/.github/workflows/issue-label-automation.yml b/.github/workflows/issue-label-automation.yml
index 9f0a1ab7..241121d4 100644
--- a/.github/workflows/issue-label-automation.yml
+++ b/.github/workflows/issue-label-automation.yml
@@ -16,7 +16,7 @@ jobs:
     steps:
       - name: Check if issue or PR was created by external contributor
         if: env.IS_HUMAN == 'true' && github.repository_owner == 'celestiaorg'
-        uses: tspascoal/get-user-teams-membership@v3
+        uses: tspascoal/get-user-teams-membership@57e9f42acd78f4d0f496b3be4368fc5f62696662 #v3.0.0
         id: teamCheck
         with:
           username: ${{ github.actor }}
diff --git a/.github/workflows/lint-pull-request.yml b/.github/workflows/lint-pull-request.yml
index 5544d085..27d25a12 100644
--- a/.github/workflows/lint-pull-request.yml
+++ b/.github/workflows/lint-pull-request.yml
@@ -15,6 +15,6 @@ jobs:
     name: conventional-commit-pr-title
     runs-on: ubuntu-latest
     steps:
-      - uses: amannn/action-semantic-pull-request@v5
+      - uses: amannn/action-semantic-pull-request@0723387faaf9b38adef4775cd42cfd5155ed6017 #v5.5.3
         env:
           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index f7a0153a..d01b83ae 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -8,11 +8,11 @@ jobs:
     runs-on: ubuntu-latest
     timeout-minutes: 8
     steps:
-      - uses: actions/checkout@v4
-      - uses: actions/setup-go@v5
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2
+      - uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b #v5.4.0
         with:
-          go-version-file: 'go.mod'
-      - uses: technote-space/get-diff-action@v6.1.2
+          go-version-file: "go.mod"
+      - uses: technote-space/get-diff-action@f27caffdd0fb9b13f4fc191c016bb4e0632844af #v6.1.2
         with:
           # This job will pass without running if go.mod, go.sum, and *.go
           # wasn't modified.
@@ -20,21 +20,21 @@ jobs:
             **/**.go
             go.mod
             go.sum
-      - uses: golangci/golangci-lint-action@v6.5.2
+      - uses: golangci/golangci-lint-action@1481404843c368bc19ca9406f87d6e0fc97bdcfd #v7.0.0
         with:
-          version: v1.61.0
+          version: v2.0.1
           args: --timeout 10m
           github-token: ${{ secrets.github_token }}
         if: env.GIT_DIFF
 
   # hadolint lints the Dockerfile
   hadolint:
-    uses: celestiaorg/.github/.github/workflows/reusable_dockerfile_lint.yml@v0.5.0
+    uses: celestiaorg/.github/.github/workflows/reusable_dockerfile_lint.yml@45533fc35847a8568deb0d4cae1851a2872f3651 #v0.5.0
     with:
       dockerfile: "docker/Dockerfile"
 
   yamllint:
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@v4
-      - uses: celestiaorg/.github/.github/actions/yamllint@v0.5.0
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2
+      - uses: celestiaorg/.github/.github/actions/yamllint@45533fc35847a8568deb0d4cae1851a2872f3651 #v0.5.0
diff --git a/.github/workflows/markdown-linter.yml b/.github/workflows/markdown-linter.yml
index a272472c..c31ec8d4 100644
--- a/.github/workflows/markdown-linter.yml
+++ b/.github/workflows/markdown-linter.yml
@@ -7,10 +7,10 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - name: Checkout code
-        uses: actions/checkout@v4
+        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2
 
       - name: Setup Node
-        uses: actions/setup-node@v4
+        uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e #v4.3.0
         with:
           node-version: 18
 
@@ -26,7 +26,7 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - name: Checkout code
-        uses: actions/checkout@v4
+        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2
 
       - name: Run markdown link check
         uses: gaurav-nelson/github-action-markdown-link-check@1.0.16
diff --git a/.github/workflows/pr-review-requester.yml b/.github/workflows/pr-review-requester.yml
index 487f52bc..18aa5817 100644
--- a/.github/workflows/pr-review-requester.yml
+++ b/.github/workflows/pr-review-requester.yml
@@ -11,7 +11,7 @@ on:
 jobs:
   auto-request-review:
     name: Auto request reviews
-    uses: celestiaorg/.github/.github/workflows/reusable_housekeeping.yml@v0.5.0
+    uses: celestiaorg/.github/.github/workflows/reusable_housekeeping.yml@45533fc35847a8568deb0d4cae1851a2872f3651 #v0.5.0
     secrets: inherit
     # write access for issues and pull requests is needed because the called
     # workflow requires write access to issues and pull requests and the
diff --git a/.github/workflows/project-automation.yml b/.github/workflows/project-automation.yml
index 4f438eb6..1ecee917 100644
--- a/.github/workflows/project-automation.yml
+++ b/.github/workflows/project-automation.yml
@@ -8,7 +8,7 @@ jobs:
     name: Add new issues to the core/app project
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/add-to-project@main
+      - uses: actions/add-to-project@244f685bbc3b7adfa8466e08b698b5577571133e #v1.0.2
         with:
           project-url: https://github.com/orgs/celestiaorg/projects/24
           github-token: ${{ secrets.ADD_TO_PROJECT_PAT }}
diff --git a/.github/workflows/protobuf.yml b/.github/workflows/protobuf.yml
index a96d055a..60e27eba 100644
--- a/.github/workflows/protobuf.yml
+++ b/.github/workflows/protobuf.yml
@@ -6,14 +6,14 @@ jobs:
     runs-on: ubuntu-latest
     timeout-minutes: 5
     steps:
-      - uses: actions/checkout@v4
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2
       - name: proto-lint
         run: make proto-lint
   proto-gen:
     runs-on: ubuntu-latest
     timeout-minutes: 5
     steps:
-      - uses: actions/checkout@v4
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2
       - name: "Check protobuf generated code matches committed code"
         # yamllint disable
         run: |
@@ -34,6 +34,6 @@ jobs:
   proto-check-breaking:
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@v4
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2
       - name: proto-check-breaking
         run: make proto-check-breaking
diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
index f4d24c2c..f6f03472 100644
--- a/.github/workflows/stale.yml
+++ b/.github/workflows/stale.yml
@@ -8,7 +8,7 @@ jobs:
   stale:
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/stale@v9
+      - uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 #v9.1.0
         with:
           repo-token: ${{ secrets.GITHUB_TOKEN }}
           stale-pr-message: >
diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml
index ea38092d..ca0de4f3 100644
--- a/.github/workflows/test-e2e.yml
+++ b/.github/workflows/test-e2e.yml
@@ -13,11 +13,11 @@ jobs:
   test-e2e:
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@v4
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2
         with:
           fetch-depth: 0
           ref: main
-      - uses: actions/setup-go@v5
+      - uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b #v5.4.0
         with:
           go-version-file: "go.mod"
       - name: Setup kubeconfig
@@ -31,7 +31,7 @@ jobs:
 
       - name: If the e2e test fails, notify Slack channel #e2e-test-failures
         if: failure()
-        uses: ravsamhq/notify-slack-action@v2
+        uses: ravsamhq/notify-slack-action@be814b201e233b2dc673608aa46e5447c8ab13f2 #v2.5.0
         with:
           status: ${{ job.status }}
           token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 22f290c5..9cec41f2 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -6,9 +6,9 @@ jobs:
   test-short:
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@v4
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2
 
-      - uses: actions/setup-go@v5
+      - uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b #v5.4.0
         with:
           go-version-file: 'go.mod'
 
@@ -19,9 +19,9 @@ jobs:
   test:
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@v4
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2
 
-      - uses: actions/setup-go@v5
+      - uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b #v5.4.0
         with:
           go-version-file: 'go.mod'
 
@@ -31,9 +31,9 @@ jobs:
   test-coverage:
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@v4
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2
 
-      - uses: actions/setup-go@v5
+      - uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b #v5.4.0
         with:
           go-version-file: 'go.mod'
 
@@ -41,16 +41,16 @@ jobs:
         run: make test-coverage
 
       - name: Upload coverage.txt
-        uses: codecov/codecov-action@v5.4.0
+        uses: codecov/codecov-action@0565863a31f2c772f9f0395002a31e3f06189574 #v5.4.0
         with:
           file: ./coverage.txt
 
   test-race:
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@v4
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2
 
-      - uses: actions/setup-go@v5
+      - uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b #v5.4.0
         with:
           go-version-file: 'go.mod'
 
@@ -60,9 +60,9 @@ jobs:
   test-fuzz:
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@v4
+      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2
 
-      - uses: actions/setup-go@v5
+      - uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b #v5.4.0
         with:
           go-version-file: 'go.mod'
 
diff --git a/.golangci.yml b/.golangci.yml
index 59be9b02..0c2df641 100644
--- a/.golangci.yml
+++ b/.golangci.yml
@@ -1,20 +1,33 @@
+version: "2"
 run:
-  timeout: 5m
   modules-download-mode: readonly
-
 linters:
   enable:
     - copyloopvar
-    - gofumpt
+    - gocritic
     - misspell
     - nakedret
-    - revive
     - prealloc
-    - stylecheck
+    - revive
+    - staticcheck
     - unconvert
-    - gocritic
-
-linters-settings:
-  nakedret:
-    # Ban the use of naked returns because they reduce code readability.
-    max-func-lines: 0 # override the default: 30
+  exclusions:
+    generated: lax
+    presets:
+      - comments
+      - common-false-positives
+      - legacy
+      - std-error-handling
+    paths:
+      - third_party$
+      - builtin$
+      - examples$
+formatters:
+  enable:
+    - gofumpt
+  exclusions:
+    generated: lax
+    paths:
+      - third_party$
+      - builtin$
+      - examples$
diff --git a/README.md b/README.md
index 730ffcb0..f900f1a9 100644
--- a/README.md
+++ b/README.md
@@ -147,7 +147,7 @@ This repo contains multiple go modules. When using it, rename `go.work.example`
 
 ### Tools
 
-1. Install [golangci-lint](https://golangci-lint.run/welcome/install) 1.61.0
+1. Install [golangci-lint](https://golangci-lint.run/welcome/install) 2.0.1
 1. Install [markdownlint](https://github.com/DavidAnson/markdownlint) 0.39.0
 1. Install [hadolint](https://github.com/hadolint/hadolint)
 1. Install [yamllint](https://yamllint.readthedocs.io/en/stable/quickstart.html)
diff --git a/app/ante/tx_size_gas.go b/app/ante/tx_size_gas.go
index 9ddd40aa..57bab8c4 100644
--- a/app/ante/tx_size_gas.go
+++ b/app/ante/tx_size_gas.go
@@ -2,6 +2,7 @@ package ante
 
 import (
 	"encoding/hex"
+	"slices"
 
 	"cosmossdk.io/errors"
 	"github.com/celestiaorg/celestia-app/v3/pkg/appconsts"
@@ -127,10 +128,8 @@ func isIncompleteSignature(data signing.SignatureData) bool {
 		if len(data.Signatures) == 0 {
 			return true
 		}
-		for _, s := range data.Signatures {
-			if isIncompleteSignature(s) {
-				return true
-			}
+		if slices.ContainsFunc(data.Signatures, isIncompleteSignature) {
+			return true
 		}
 	}
 
diff --git a/app/app.go b/app/app.go
index 068ec76a..9087d531 100644
--- a/app/app.go
+++ b/app/app.go
@@ -755,9 +755,9 @@ func (app *App) RegisterAPIRoutes(apiSvr *api.Server, _ config.APIConfig) {
 
 // RegisterTxService implements the Application.RegisterTxService method.
 func (app *App) RegisterTxService(clientCtx client.Context) {
-	authtx.RegisterTxService(app.BaseApp.GRPCQueryRouter(), clientCtx, app.BaseApp.Simulate, app.interfaceRegistry)
-	celestiatx.RegisterTxService(app.BaseApp.GRPCQueryRouter(), clientCtx, app.interfaceRegistry)
-	gasestimation.RegisterGasEstimationService(app.BaseApp.GRPCQueryRouter(), clientCtx, app.txConfig.TxDecoder(), app.getGovMaxSquareBytes, app.BaseApp.Simulate)
+	authtx.RegisterTxService(app.GRPCQueryRouter(), clientCtx, app.Simulate, app.interfaceRegistry)
+	celestiatx.RegisterTxService(app.GRPCQueryRouter(), clientCtx, app.interfaceRegistry)
+	gasestimation.RegisterGasEstimationService(app.GRPCQueryRouter(), clientCtx, app.txConfig.TxDecoder(), app.getGovMaxSquareBytes, app.Simulate)
 }
 
 func (app *App) getGovMaxSquareBytes() (uint64, error) {
@@ -771,7 +771,7 @@ func (app *App) getGovMaxSquareBytes() (uint64, error) {
 
 // RegisterTendermintService implements the Application.RegisterTendermintService method.
 func (app *App) RegisterTendermintService(clientCtx client.Context) {
-	tmservice.RegisterTendermintService(clientCtx, app.BaseApp.GRPCQueryRouter(), app.interfaceRegistry, app.Query)
+	tmservice.RegisterTendermintService(clientCtx, app.GRPCQueryRouter(), app.interfaceRegistry, app.Query)
 }
 
 func (app *App) RegisterNodeService(clientCtx client.Context) {
diff --git a/app/export.go b/app/export.go
index 0a74812e..0a82cbdd 100644
--- a/app/export.go
+++ b/app/export.go
@@ -50,7 +50,7 @@ func (app *App) ExportAppStateAndValidators(forZeroHeight bool, jailAllowedAddrs
 		AppState:        appState,
 		Validators:      validators,
 		Height:          app.getExportHeight(forZeroHeight),
-		ConsensusParams: app.BaseApp.GetConsensusParams(ctx),
+		ConsensusParams: app.GetConsensusParams(ctx),
 	}, nil
 }
 
@@ -67,12 +67,7 @@ func (app *App) getExportHeight(forZeroHeight bool) int64 {
 // genesis is a temporary feature which will be deprecated in favour of export
 // at a block height.
 func (app *App) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs []string) {
-	applyAllowedAddrs := false
-
-	// check if there is an allowed address list
-	if len(jailAllowedAddrs) > 0 {
-		applyAllowedAddrs = true
-	}
+	applyAllowedAddrs := len(jailAllowedAddrs) > 0
 
 	allowedAddrsMap := make(map[string]bool)
 
diff --git a/app/grpc/gasestimation/gas_estimator.go b/app/grpc/gasestimation/gas_estimator.go
index ed481fbf..3a529815 100644
--- a/app/grpc/gasestimation/gas_estimator.go
+++ b/app/grpc/gasestimation/gas_estimator.go
@@ -4,6 +4,7 @@ import (
 	"context"
 	"errors"
 	"fmt"
+	"math"
 	"sort"
 
 	tmclient "github.com/tendermint/tendermint/rpc/client"
@@ -126,6 +127,20 @@ func (s *gasEstimatorServer) estimateGasPrice(ctx context.Context, priority TxPr
 	return estimateGasPriceForTransactions(gasPrices, priority)
 }
 
+const (
+	// highPriorityGasAdjustmentRate is the percentage increase applied to the
+	// estimated gas price when the block is more than 70% full, i.e., gasPriceEstimationThreshold,
+	// but the gas prices are tightly clustered. This ensures that high-priority
+	// transactions still have a competitive fee to improve inclusion probability.
+	highPriorityGasAdjustmentRate = 1.3
+	// mediumPriorityGasAdjustmentRate similar to highPriorityGasAdjustmentRate but for
+	// the medium priority.
+	mediumPriorityGasAdjustmentRate = 1.1
+	// gasPriceAdjustmentThreshold the standard deviation threshold under which we
+	// apply the gas price adjustment.
+	gasPriceAdjustmentThreshold = 0.001
+)
+
 // estimateGasPriceForTransactions takes a list of transactions and priority
 // and returns a gas price estimation.
 // The priority sets the estimation as follows:
@@ -133,14 +148,24 @@ func (s *gasEstimatorServer) estimateGasPrice(ctx context.Context, priority TxPr
 // - Medium Priority: The gas price is the median price of the all gas prices in the mempool.
 // - Low Priority: The gas price is the median price of the bottom 10% of gas prices in the mempool.
 // - Unspecified Priority (default): This is equivalent to the Medium priority, using the median price of all gas prices in the mempool.
+// If the list of gas prices has a standard deviation < gasPriceAdjustmentThreshold, meaning the gas price values are tightly clustered,
+// an increase of 30% and 10% will be added for high and medium priority respectively.
 // More information can be found in ADR-023.
 func estimateGasPriceForTransactions(gasPrices []float64, priority TxPriority) (float64, error) {
 	if len(gasPrices) == 0 {
 		return 0, errors.New("empty gas prices list")
 	}
+	stDev := StandardDeviation(Mean(gasPrices), gasPrices)
 	switch priority {
-	case TxPriority_TX_PRIORITY_UNSPECIFIED:
-		return Median(gasPrices)
+	case TxPriority_TX_PRIORITY_MEDIUM, TxPriority_TX_PRIORITY_UNSPECIFIED:
+		estimation, err := Median(gasPrices)
+		if err != nil {
+			return 0, err
+		}
+		if stDev < gasPriceAdjustmentThreshold {
+			return estimation * mediumPriorityGasAdjustmentRate, nil
+		}
+		return estimation, nil
 	case TxPriority_TX_PRIORITY_LOW:
 		bottom10PercentIndex := len(gasPrices) * 10 / 100
 		if bottom10PercentIndex == 0 {
@@ -148,10 +173,15 @@ func estimateGasPriceForTransactions(gasPrices []float64, priority TxPriority) (
 			bottom10PercentIndex = 1
 		}
 		return Median(gasPrices[:bottom10PercentIndex])
-	case TxPriority_TX_PRIORITY_MEDIUM:
-		return Median(gasPrices)
 	case TxPriority_TX_PRIORITY_HIGH:
-		return Median(gasPrices[len(gasPrices)*90/100:])
+		estimation, err := Median(gasPrices[len(gasPrices)*90/100:])
+		if err != nil {
+			return 0, err
+		}
+		if stDev < gasPriceAdjustmentThreshold {
+			return estimation * highPriorityGasAdjustmentRate, nil
+		}
+		return estimation, nil
 	default:
 		return 0, fmt.Errorf("unknown priority: %d", priority)
 	}
@@ -221,3 +251,29 @@ func Median(gasPrices []float64) (float64, error) {
 	mid2 := gasPrices[n/2]
 	return (mid1 + mid2) / 2.0, nil
 }
+
+// Mean calculates the mean value of the provided gas prices.
+func Mean(gasPrices []float64) float64 {
+	if len(gasPrices) == 0 {
+		return 0
+	}
+	sum := 0.0
+	for _, gasPrice := range gasPrices {
+		sum += gasPrice
+	}
+	return sum / float64(len(gasPrices))
+}
+
+// StandardDeviation calculates the standard deviation of the provided gas prices.
+func StandardDeviation(meanGasPrice float64, gasPrices []float64) float64 {
+	if len(gasPrices) < 2 {
+		return 0
+	}
+	var variance float64
+	for _, gasPrice := range gasPrices {
+		diff := gasPrice - meanGasPrice
+		variance += diff * diff
+	}
+	variance /= float64(len(gasPrices))
+	return math.Sqrt(variance)
+}
diff --git a/app/init.go b/app/init.go
index 54c6d7b9..c792641b 100644
--- a/app/init.go
+++ b/app/init.go
@@ -1,6 +1,7 @@
 package app
 
 import (
+	"fmt"
 	"os"
 	"path/filepath"
 )
@@ -16,25 +17,23 @@ const appDirectory = ".celestia-app"
 // If celestiaHome isn't specified, the default user home directory will be used.
 const celestiaHome = "CELESTIA_HOME"
 
-// DefaultNodeHome is the default home directory for the application daemon.
-// This gets set as a side-effect of the init() function.
+// DefaultNodeHome is the home directory for the app directory. In other words,
+// this is the path to the directory that will contain .celestia-app. This gets
+// set as a side-effect of the init() function.
 var DefaultNodeHome string
 
 func init() {
+	celestiaHome := os.Getenv(celestiaHome)
 	userHome, err := os.UserHomeDir()
 	if err != nil {
-		panic(err)
+		// The userHome is not set in Vercel's Go runtime so log a warning but don't panic.
+		fmt.Printf("Warning userHome err: %s\n", err)
 	}
-	celestiaHome := os.Getenv(celestiaHome)
-	DefaultNodeHome = getDefaultNodeHome(userHome, celestiaHome)
+	DefaultNodeHome = getDefaultNodeHome(celestiaHome, userHome)
 }
 
-// getDefaultNodeHome computes the default node home directory based on the
-// provided userHome and celestiaHome. If celestiaHome is provided, it takes
-// precedence and constructs the path by appending the application directory.
-// Otherwise, it falls back to using the userHome with the application directory
-// appended.
-func getDefaultNodeHome(userHome string, celestiaHome string) string {
+// getDefaultNodeHome returns the location of the default home app directory.
+func getDefaultNodeHome(celestiaHome string, userHome string) string {
 	if celestiaHome != "" {
 		return filepath.Join(celestiaHome, appDirectory)
 	}
diff --git a/app/modules.go b/app/modules.go
index b921f507..ecdafbd2 100644
--- a/app/modules.go
+++ b/app/modules.go
@@ -95,7 +95,7 @@ func (app *App) setupModuleManager(skipGenesisInvariants bool) error {
 	var err error
 	app.manager, err = module.NewManager([]module.VersionedModule{
 		{
-			Module:      genutil.NewAppModule(app.AccountKeeper, app.StakingKeeper, app.BaseApp.DeliverTx, app.txConfig),
+			Module:      genutil.NewAppModule(app.AccountKeeper, app.StakingKeeper, app.DeliverTx, app.txConfig),
 			FromVersion: v1, ToVersion: v3,
 		},
 		{
diff --git a/docs/architecture/adr-023-gas-used-and-gas-price-estimation.md b/docs/architecture/adr-023-gas-used-and-gas-price-estimation.md
index f3cdb600..f468b9a8 100644
--- a/docs/architecture/adr-023-gas-used-and-gas-price-estimation.md
+++ b/docs/architecture/adr-023-gas-used-and-gas-price-estimation.md
@@ -48,6 +48,8 @@ There are multiple ways to have a gas price estimation for a priority level. Thi
 
 If the mempool has more transactions that it can fit in the next block, the estimation will be based on the top gas prices that can fit in a full block. Otherwise, if the mempool transactions can't fill more than 70% of the max block size, the minimum gas price will be returned.
 
+If the gas prices used for the estimation are tightly clustered, an increase of 30% and 10% will be added for high and medium priority respectively. Tightly clustered values are defined by the standard deviation of the elements being below the `gasPriceAdjustmentThreshold`. 
+
 The following is a basic implementation of the median that we can use:
 
 ```go
diff --git a/docs/release-notes/pending-release.md b/docs/release-notes/pending-release.md
index c7e9198b..c3e0cf9d 100644
--- a/docs/release-notes/pending-release.md
+++ b/docs/release-notes/pending-release.md
@@ -4,4 +4,6 @@
 
 ### Node Operators (v4.0.0)
 
+- Node operators must upgrade to the latest release of celestia-app (e.g. v4.x.x) prior to signalling for the v4 upgrade. This release will run the latest v3.x.x celestia-app via the multiplexer prior to the v4 activation height. The latest v3.x.x release contains a reduction to the upgrade delay height on testnets. See <https://github.com/celestiaorg/celestia-app/pull/4414>.
+
 ### Library Consumers (v4.0.0)
diff --git a/go.mod b/go.mod
index add1eb4a..b46857fd 100644
--- a/go.mod
+++ b/go.mod
@@ -17,14 +17,14 @@ require (
 	github.com/cosmos/gogoproto v1.7.0
 	github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v6 v6.1.2
 	github.com/cosmos/ibc-go/v6 v6.2.2
-	github.com/ethereum/go-ethereum v1.15.5
+	github.com/ethereum/go-ethereum v1.15.6
 	github.com/gogo/protobuf v1.3.3
 	github.com/golang/mock v1.6.0
 	github.com/golang/protobuf v1.5.4
 	github.com/gorilla/mux v1.8.1
 	github.com/grpc-ecosystem/grpc-gateway v1.16.0
 	github.com/rakyll/statik v0.1.7
-	github.com/rs/zerolog v1.33.0
+	github.com/rs/zerolog v1.34.0
 	github.com/spf13/cast v1.6.0
 	github.com/spf13/cobra v1.8.1
 	github.com/spf13/pflag v1.0.6
@@ -34,7 +34,7 @@ require (
 	golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8
 	google.golang.org/genproto/googleapis/api v0.0.0-20250106144421-5f5ef82da422
 	google.golang.org/grpc v1.71.0
-	google.golang.org/protobuf v1.36.5
+	google.golang.org/protobuf v1.36.6
 	gopkg.in/yaml.v2 v2.4.0
 	k8s.io/apimachinery v0.32.3
 )
@@ -199,7 +199,7 @@ require (
 	github.com/rivo/uniseg v0.4.4 // indirect
 	github.com/rogpeppe/go-internal v1.13.1 // indirect
 	github.com/rs/cors v1.8.3 // indirect
-	github.com/rs/xid v1.5.0 // indirect
+	github.com/rs/xid v1.6.0 // indirect
 	github.com/sasha-s/go-deadlock v0.3.1 // indirect
 	github.com/shirou/gopsutil v3.21.6+incompatible // indirect
 	github.com/sirupsen/logrus v1.9.3 // indirect
@@ -258,7 +258,7 @@ require (
 replace (
 	github.com/cosmos/cosmos-sdk => github.com/celestiaorg/cosmos-sdk v1.27.0-sdk-v0.46.16
 	// Replace IBC with celestiaorg fork which includes fixes for security vulnerabilities.
-	github.com/cosmos/ibc-go/v6 => github.com/celestiaorg/ibc-go/v6 v6.2.4
+	github.com/cosmos/ibc-go/v6 => github.com/celestiaorg/ibc-go/v6 v6.2.5
 	github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1
 	github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7
 	github.com/tendermint/tendermint => github.com/celestiaorg/celestia-core v1.51.0-tm-v0.34.35
diff --git a/go.sum b/go.sum
index d3a38681..95c6d5a5 100644
--- a/go.sum
+++ b/go.sum
@@ -326,8 +326,8 @@ github.com/celestiaorg/go-square v1.1.1 h1:Cy3p8WVspVcyOqHM8BWFuuYPwMitO1pYGe+Im
 github.com/celestiaorg/go-square v1.1.1/go.mod h1:1EXMErhDrWJM8B8V9hN7dqJ2kUTClfwdqMOmF9yQUa0=
 github.com/celestiaorg/go-square/v2 v2.1.0 h1:ECIvYEeHIWiIJGDCJxQNtzqm5DmnBly7XGhSpLsl+Lw=
 github.com/celestiaorg/go-square/v2 v2.1.0/go.mod h1:n3ztrh8CBjWOD6iWYMo3pPOlQIgzLK9yrnqMPcNo6g8=
-github.com/celestiaorg/ibc-go/v6 v6.2.4 h1:S9jH7e+faYWF9PgDQAQnHxgm+FeDWTKcOF99Zez40bA=
-github.com/celestiaorg/ibc-go/v6 v6.2.4/go.mod h1:XLsARy4Y7+GtAqzMcxNdlQf6lx+ti1e8KcMGv5NIK7A=
+github.com/celestiaorg/ibc-go/v6 v6.2.5 h1:mUmZptulQGsGgyBqmdBeSCPQtMu0aFMJstgvKhUdqy4=
+github.com/celestiaorg/ibc-go/v6 v6.2.5/go.mod h1:XLsARy4Y7+GtAqzMcxNdlQf6lx+ti1e8KcMGv5NIK7A=
 github.com/celestiaorg/knuu v0.16.3 h1:ORmcBoSW+67iPKF0yIGKwWMefphk5hvy08KklmCT0aw=
 github.com/celestiaorg/knuu v0.16.3/go.mod h1:nB7IGCR984YKEDW+j5xHPOidYfbO4DoZI1rDKijvF5E=
 github.com/celestiaorg/merkletree v0.0.0-20210714075610-a84dc3ddbbe4 h1:CJdIpo8n5MFP2MwK0gSRcOVlDlFdQJO1p+FqdxYzmvc=
@@ -466,6 +466,7 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1
 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc=
 github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218=
 github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M=
+github.com/deepmap/oapi-codegen v1.8.2 h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbzjuhfU=
 github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw=
 github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I=
 github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE=
@@ -522,8 +523,8 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7
 github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA=
 github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0=
 github.com/ethereum/go-ethereum v1.10.17/go.mod h1:Lt5WzjM07XlXc95YzrhosmR4J9Ahd6X2wyEV2SvGhk0=
-github.com/ethereum/go-ethereum v1.15.5 h1:Fo2TbBWC61lWVkFw9tsMoHCNX1ndpuaQBRJ8H6xLUPo=
-github.com/ethereum/go-ethereum v1.15.5/go.mod h1:1LG2LnMOx2yPRHR/S+xuipXH29vPr6BIH6GElD8N/fo=
+github.com/ethereum/go-ethereum v1.15.6 h1:jgLoUM6/pNjp0uEnXyWcWikDwa4j1wZlcqkX8Pm8A+I=
+github.com/ethereum/go-ethereum v1.15.6/go.mod h1:+S9k+jFzlyVTNcYGvqFhzN/SFhI6vA+aOY4T5tLSPL0=
 github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8=
 github.com/ethereum/go-verkle v0.2.2/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk=
 github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U=
@@ -538,6 +539,8 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv
 github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
 github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
 github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
+github.com/ferranbt/fastssz v0.1.2 h1:Dky6dXlngF6Qjc+EfDipAkE83N5I5DE68bY6O0VLNPk=
+github.com/ferranbt/fastssz v0.1.2/go.mod h1:X5UPrE2u1UJjxHA8X54u04SBwdAQjG2sFtWs39YxyWs=
 github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0=
 github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
 github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw=
@@ -552,6 +555,7 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos
 github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
 github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E=
 github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
+github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI=
 github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww=
 github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4=
 github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4=
@@ -781,6 +785,7 @@ github.com/grafana/pyroscope-go v1.1.2 h1:7vCfdORYQMCxIzI3NlYAs3FcBP760+gWuYWOyi
 github.com/grafana/pyroscope-go v1.1.2/go.mod h1:HSSmHo2KRn6FasBA4vK7BMiQqyQq8KSuBKvrhkXxYPU=
 github.com/grafana/pyroscope-go/godeltaprof v0.1.8 h1:iwOtYXeeVSAeYefJNaxDytgjKtUuKQbJqgAIjlnicKg=
 github.com/grafana/pyroscope-go/godeltaprof v0.1.8/go.mod h1:2+l7K7twW49Ct4wFluZD3tZ6e0SjanjcUUBPVD/UuGU=
+github.com/graph-gophers/graphql-go v1.3.0 h1:Eb9x/q6MFpCLz7jBCiP/WTxjSDrYLR1QY41SORZyNJ0=
 github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc=
 github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
 github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI=
@@ -865,11 +870,15 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
 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 h1:HGBfZYStlx3Kqvsv1h2pJixbCl/jhnFtxpKFAv9Tu5k=
 github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8=
 github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
+github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c h1:qSHzRbhzK8RdXOsAdfDgO49TtqC1oZ+acxPrkfTxcCs=
+github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
 github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk=
 github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE=
 github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo=
+github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 h1:vilfsDSy7TDxedi9gyBkMvAirat/oRcL0lFdJBf6tdM=
 github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo=
 github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8=
 github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE=
@@ -1004,6 +1013,8 @@ github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=
 github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=
 github.com/minio/minio-go/v7 v7.0.74 h1:fTo/XlPBTSpo3BAMshlwKL5RspXRv9us5UeHEGYCFe0=
 github.com/minio/minio-go/v7 v7.0.74/go.mod h1:qydcVzV8Hqtj1VtEocfxbmVFa2siu6HGa+LDEPogjD8=
+github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g=
+github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM=
 github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
 github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
 github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
@@ -1091,6 +1102,8 @@ github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKw
 github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
 github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
 github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
+github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
+github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
 github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA=
 github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
 github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
@@ -1108,6 +1121,7 @@ github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNH
 github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=
 github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
 github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc=
+github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 h1:oYW+YCJ1pachXTQmzR3rNLYGGz4g/UgFcjb28p/viDM=
 github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0=
 github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o=
 github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08 h1:hDSdbBuw3Lefr6R18ax0tZ2BJeNB3NehB3trOwYBsdU=
@@ -1196,10 +1210,10 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN
 github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
 github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo=
 github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU=
-github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc=
-github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
-github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8=
-github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
+github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU=
+github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=
+github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY=
+github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ=
 github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
 github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww=
 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
@@ -2034,8 +2048,8 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ
 google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
-google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=
-google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
+google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
+google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff --git a/pkg/appconsts/versioned_consts.go b/pkg/appconsts/versioned_consts.go
index 0ddbe16f..621bc830 100644
--- a/pkg/appconsts/versioned_consts.go
+++ b/pkg/appconsts/versioned_consts.go
@@ -11,6 +11,9 @@ import (
 
 const (
 	LatestVersion = v3.Version
+	// numBlocksPerDay is the number of blocks in a day assuming a block
+	// interval of 6 seconds. Equivalent to 14,400 blocks.
+	numBlocksPerDay = int64(24 * 60 * 60 / 6)
 )
 
 // SubtreeRootThreshold works as a target upper bound for the number of subtree
@@ -78,12 +81,15 @@ func GetTimeoutCommit(v uint64) time.Duration {
 	}
 }
 
-// UpgradeHeightDelay returns the delay in blocks after a quorum has been reached that the chain should upgrade to the new version.
-func UpgradeHeightDelay(chainID string, v uint64) int64 {
+// UpgradeHeightDelay returns the delay in blocks after a quorum has been
+// reached that the chain should upgrade to the new version. The version
+// argument should be the current application version, not the version after the
+// upgrade.
+func UpgradeHeightDelay(chainID string, version uint64) int64 {
 	if chainID == TestChainID {
 		return 3
 	}
-	switch v {
+	switch version {
 	case v1.Version:
 		return v1.UpgradeHeightDelay
 	case v2.Version:
@@ -94,7 +100,16 @@ func UpgradeHeightDelay(chainID string, v uint64) int64 {
 			return v3.UpgradeHeightDelay
 		}
 		return v2.UpgradeHeightDelay
-	default:
-		return v3.UpgradeHeightDelay
+	case v3.Version:
+		switch chainID {
+		case ArabicaChainID:
+			return numBlocksPerDay
+		case MochaChainID:
+			return numBlocksPerDay * 2
+		case MainnetChainID:
+			return v3.UpgradeHeightDelay
+		}
 	}
+	// TODO: this should panic because this should never be invoked for v4+
+	return v3.UpgradeHeightDelay
 }
diff --git a/pkg/da/data_availability_header.go b/pkg/da/data_availability_header.go
index 1bd2dc5d..b5445da6 100644
--- a/pkg/da/data_availability_header.go
+++ b/pkg/da/data_availability_header.go
@@ -203,8 +203,8 @@ func EmptySquareShares() []share.Share {
 
 // SquareSize is a copy of the function defined in the square package to avoid
 // a circular dependency. TODO deduplicate
-func SquareSize(len int) int {
-	return RoundUpPowerOfTwo(int(math.Ceil(math.Sqrt(float64(len)))))
+func SquareSize(length int) int {
+	return RoundUpPowerOfTwo(int(math.Ceil(math.Sqrt(float64(length)))))
 }
 
 // RoundUpPowerOfTwo returns the next power of two greater than or equal to input.
diff --git a/pkg/user/tx_client.go b/pkg/user/tx_client.go
index 8567a95a..993290c5 100644
--- a/pkg/user/tx_client.go
+++ b/pkg/user/tx_client.go
@@ -652,10 +652,7 @@ func QueryMinimumGasPrice(ctx context.Context, grpcConn *grpc.ClientConn) (float
 	}
 
 	// return the highest value of the two
-	if networkMinPrice > localMinPrice {
-		return networkMinPrice, nil
-	}
-	return localMinPrice, nil
+	return max(localMinPrice, networkMinPrice), nil
 }
 
 func QueryNetworkMinGasPrice(ctx context.Context, grpcConn *grpc.ClientConn) (float64, error) {
diff --git a/tools/blocktime/main.go b/tools/blocktime/main.go
index 661c4dad..bee5ca89 100644
--- a/tools/blocktime/main.go
+++ b/tools/blocktime/main.go
@@ -42,17 +42,14 @@ func Run() error {
 		}
 	}
 	blockTimes := make([]time.Time, 0, queryRange)
-	firstHeight := lastHeight - int64(queryRange) + 1
-	if firstHeight < 1 {
-		firstHeight = 1
-	}
+	firstHeight := max(lastHeight-int64(queryRange)+1, 1)
 	for height := firstHeight; height <= lastHeight; height++ {
 		resp, err := c.Commit(context.Background(), &height)
 		if err != nil {
 			return err
 		}
 
-		blockTimes = append(blockTimes, resp.Header.Time)
+		blockTimes = append(blockTimes, resp.Time)
 	}
 	avgTime, minTime, maxTime, stdvTime := analyzeBlockTimes(blockTimes)
 	fmt.Printf(`
@@ -89,7 +86,7 @@ func analyzeBlockTimes(times []time.Time) (float64, float64, float64, float64) {
 		if maxTime == 0 || diff > maxTime {
 			maxTime = diff
 		}
-		variance += math.Pow(averageTime-diff, 2)
+		variance += (averageTime - diff) * (averageTime - diff)
 	}
 	stddev := math.Sqrt(variance / float64(numberOfObservations))
 	return averageTime, minTime, maxTime, stddev
diff --git a/tools/chainbuilder/main.go b/tools/chainbuilder/main.go
index 914706ba..bfcd9046 100644
--- a/tools/chainbuilder/main.go
+++ b/tools/chainbuilder/main.go
@@ -379,9 +379,9 @@ func Run(ctx context.Context, cfg BuilderConfig, dir string) error {
 				LastCommitInfo: lastCommitInfo,
 			})
 
-			deliverTxResponses := make([]*abci.ResponseDeliverTx, len(block.Data.Txs))
+			deliverTxResponses := make([]*abci.ResponseDeliverTx, len(block.Txs))
 
-			for idx, tx := range block.Data.Txs {
+			for idx, tx := range block.Txs {
 				blobTx, isBlobTx := types.UnmarshalBlobTx(tx)
 				if isBlobTx {
 					tx = blobTx.Tx
diff --git a/x/blob/ante/max_total_blob_size_ante.go b/x/blob/ante/max_total_blob_size_ante.go
index 98cd6754..f02e391a 100644
--- a/x/blob/ante/max_total_blob_size_ante.go
+++ b/x/blob/ante/max_total_blob_size_ante.go
@@ -31,11 +31,11 @@ func (d MaxTotalBlobSizeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simula
 		return next(ctx, tx, simulate)
 	}
 
-	max := d.maxTotalBlobSize(ctx)
+	maximum := d.maxTotalBlobSize(ctx)
 	for _, m := range tx.GetMsgs() {
 		if pfb, ok := m.(*blobtypes.MsgPayForBlobs); ok {
-			if total := getTotal(pfb.BlobSizes); total > max {
-				return ctx, errors.Wrapf(blobtypes.ErrTotalBlobSizeTooLarge, "total blob size %d exceeds max %d", total, max)
+			if total := getTotal(pfb.BlobSizes); total > maximum {
+				return ctx, errors.Wrapf(blobtypes.ErrTotalBlobSizeTooLarge, "total blob size %d exceeds max %d", total, maximum)
 			}
 		}
 	}
@@ -71,7 +71,8 @@ func (d MaxTotalBlobSizeDecorator) getMaxSquareSize(ctx sdk.Context) int {
 
 	upperBound := appconsts.SquareSizeUpperBound(ctx.BlockHeader().Version.App)
 	govParam := d.k.GovMaxSquareSize(ctx)
-	return min(upperBound, int(govParam))
+	minimum := min(upperBound, int(govParam))
+	return minimum
 }
 
 // getTotal returns the sum of the given sizes.
diff --git a/x/blobstream/client/verify.go b/x/blobstream/client/verify.go
index 57822397..d76ac7b6 100644
--- a/x/blobstream/client/verify.go
+++ b/x/blobstream/client/verify.go
@@ -82,11 +82,11 @@ func txCmd() *cobra.Command {
 				return err
 			}
 
-			version := blockRes.Block.Header.Version.App
+			version := blockRes.Block.Version.App
 			maxSquareSize := appconsts.SquareSizeUpperBound(version)
 			subtreeRootThreshold := appconsts.SubtreeRootThreshold(version)
 
-			shareRange, err := square.TxShareRange(blockRes.Block.Data.Txs.ToSliceOfBytes(), int(tx.Index), maxSquareSize, subtreeRootThreshold)
+			shareRange, err := square.TxShareRange(blockRes.Block.Txs.ToSliceOfBytes(), int(tx.Index), maxSquareSize, subtreeRootThreshold)
 			if err != nil {
 				return err
 			}
@@ -152,7 +152,7 @@ func blobCmd() *cobra.Command {
 				return err
 			}
 
-			version := blockRes.Block.Header.Version.App
+			version := blockRes.Block.Version.App
 			maxSquareSize := appconsts.SquareSizeUpperBound(version)
 			subtreeRootThreshold := appconsts.SubtreeRootThreshold(version)
 			blobShareRange, err := square.BlobShareRange(blockRes.Block.Txs.ToSliceOfBytes(), int(tx.Index), blobIndexInt, maxSquareSize, subtreeRootThreshold)



Test patch:
diff --git a/app/grpc/gasestimation/gas_estimator_test.go b/app/grpc/gasestimation/gas_estimator_test.go
index c6876dc7..ee3d603a 100644
--- a/app/grpc/gasestimation/gas_estimator_test.go
+++ b/app/grpc/gasestimation/gas_estimator_test.go
@@ -1,8 +1,12 @@
 package gasestimation
 
 import (
+	"math"
 	"testing"
 
+	"github.com/celestiaorg/celestia-app/v3/pkg/appconsts"
+	"github.com/tendermint/tendermint/libs/rand"
+
 	"github.com/stretchr/testify/require"
 
 	"github.com/stretchr/testify/assert"
@@ -105,6 +109,64 @@ func TestEstimateGasPriceForTransactions(t *testing.T) {
 	}
 }
 
+func TestEstimateClusteredGasPrices(t *testing.T) {
+	minGasPrice := appconsts.DefaultMinGasPrice * 2
+	maxGasPrice := minGasPrice + gasPriceAdjustmentThreshold
+	gasPrices := make([]float64, 20)
+	for i := range gasPrices {
+		randomGasPrice := minGasPrice + rand.Float64()*(maxGasPrice-minGasPrice)
+		gasPrices[i] = randomGasPrice
+	}
+	medianGasPrice, err := Median(gasPrices)
+	require.NoError(t, err)
+	medianGasPrice *= mediumPriorityGasAdjustmentRate
+	bottomMedian, err := Median(gasPrices[:len(gasPrices)*10/100])
+	require.NoError(t, err)
+	topMedian, err := Median(gasPrices[len(gasPrices)*90/100:])
+	require.NoError(t, err)
+	topMedian *= highPriorityGasAdjustmentRate
+
+	tests := []struct {
+		name     string
+		priority TxPriority
+		want     float64
+		wantErr  bool
+	}{
+		{
+			name:     "NONE -> same as MEDIUM (median)",
+			priority: TxPriority_TX_PRIORITY_UNSPECIFIED,
+			want:     medianGasPrice,
+		},
+		{
+			name:     "LOW -> bottom 10% median",
+			priority: TxPriority_TX_PRIORITY_LOW,
+			want:     bottomMedian,
+		},
+		{
+			name:     "MEDIUM -> median",
+			priority: TxPriority_TX_PRIORITY_MEDIUM,
+			want:     medianGasPrice,
+		},
+		{
+			name:     "HIGH -> top 10% median",
+			priority: TxPriority_TX_PRIORITY_HIGH,
+			want:     topMedian,
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			got, err := estimateGasPriceForTransactions(gasPrices, tt.priority)
+			if tt.wantErr {
+				assert.Error(t, err)
+			} else {
+				assert.NoError(t, err)
+				assert.Equal(t, tt.want, got)
+			}
+		})
+	}
+}
+
 func TestEstimateGasPriceSmallList(t *testing.T) {
 	gasPrices := []float64{10, 20, 30, 40, 50, 60}
 	bottomMedian, err := Median(gasPrices[:1])
@@ -114,3 +176,82 @@ func TestEstimateGasPriceSmallList(t *testing.T) {
 	assert.NoError(t, err)
 	assert.Equal(t, got, bottomMedian)
 }
+
+func TestMean(t *testing.T) {
+	tests := []struct {
+		name      string
+		gasPrices []float64
+		want      float64
+	}{
+		{
+			name:      "Empty slice",
+			gasPrices: []float64{},
+			want:      0,
+		},
+		{
+			name:      "Single element",
+			gasPrices: []float64{10},
+			want:      10,
+		},
+		{
+			name:      "Multiple elements",
+			gasPrices: []float64{1, 2, 3, 4, 5},
+			want:      3,
+		},
+		{
+			name:      "Mixed floats",
+			gasPrices: []float64{1.5, 2.5, 3.5},
+			want:      2.5,
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			got := Mean(tt.gasPrices)
+			if got != tt.want {
+				t.Errorf("mean(%v) = %v, want %v", tt.gasPrices, got, tt.want)
+			}
+		})
+	}
+}
+
+func TestStandardDeviation(t *testing.T) {
+	tests := []struct {
+		name      string
+		gasPrices []float64
+		want      float64
+	}{
+		{
+			name:      "Empty slice",
+			gasPrices: []float64{},
+			want:      0,
+		},
+		{
+			name:      "Single element",
+			gasPrices: []float64{10},
+			want:      0,
+		},
+		{
+			name:      "Multiple elements",
+			gasPrices: []float64{10, 20, 30, 40, 50},
+			// Variance = 200, stdev ~ 14.142135...
+			want: 14.142135623730951,
+		},
+		{
+			name:      "Identical elements",
+			gasPrices: []float64{5, 5, 5, 5},
+			want:      0,
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			meanVal := Mean(tt.gasPrices)
+			got := StandardDeviation(meanVal, tt.gasPrices)
+			// We'll do a tolerance check for floating-point comparisons.
+			if math.Abs(got-tt.want) > 1e-9 {
+				t.Errorf("stdDev(%v) = %v, want %v", tt.gasPrices, got, tt.want)
+			}
+		})
+	}
+}
diff --git a/app/init_test.go b/app/init_test.go
index f54759a3..57df36e5 100644
--- a/app/init_test.go
+++ b/app/init_test.go
@@ -9,41 +9,41 @@ import (
 func Test_getDefaultNodeHome(t *testing.T) {
 	type testCase struct {
 		name         string
-		userHome     string
 		celestiaHome string
+		userHome     string
 		want         string
 	}
 
 	testCases := []testCase{
 		{
-			name:         "want .celestia-app when userHome is empty and celestiaHome is empty",
-			userHome:     "",
+			name:         "by default use the root directory",
 			celestiaHome: "",
+			userHome:     "",
 			want:         ".celestia-app",
 		},
 		{
-			name:         "want celestia-home/.celestia-app when userHome is empty and celestiaHome is not empty",
-			userHome:     "",
+			name:         "use celestia-home if it is set",
 			celestiaHome: "celestia-home",
+			userHome:     "",
 			want:         "celestia-home/.celestia-app",
 		},
 		{
-			name:         "want user-home/.celestia-app when userHome is not empty and celestiaHome is empty",
-			userHome:     "user-home",
+			name:         "use user-home if it is set",
 			celestiaHome: "",
+			userHome:     "user-home",
 			want:         "user-home/.celestia-app",
 		},
 		{
-			name:         "want celestiaHome to take precedence if both are not empty",
-			userHome:     "user-home",
+			name:         "celestia-home takes precedence over user-home",
 			celestiaHome: "celestia-home",
+			userHome:     "user-home",
 			want:         "celestia-home/.celestia-app",
 		},
 	}
 
 	for _, tc := range testCases {
 		t.Run(tc.name, func(t *testing.T) {
-			got := getDefaultNodeHome(tc.userHome, tc.celestiaHome)
+			got := getDefaultNodeHome(tc.celestiaHome, tc.userHome)
 			assert.Equal(t, tc.want, got)
 		})
 	}
diff --git a/app/test/integration_test.go b/app/test/integration_test.go
index 7ee8e08d..0bb1c003 100644
--- a/app/test/integration_test.go
+++ b/app/test/integration_test.go
@@ -130,7 +130,7 @@ func (s *IntegrationTestSuite) TestMaxBlockSize() {
 				// this test must create transactions that are smaller than that.
 				require.LessOrEqual(t, len(tx), 1*mebibyte)
 
-				res, err := s.cctx.Context.BroadcastTxSync(tx)
+				res, err := s.cctx.BroadcastTxSync(tx)
 				require.NoError(t, err)
 				assert.Equal(t, abci.CodeTypeOK, res.Code, res.RawLog)
 				if res.Code != abci.CodeTypeOK {
@@ -157,17 +157,17 @@ func (s *IntegrationTestSuite) TestMaxBlockSize() {
 			sizes := []uint64{}
 			// check the square size
 			for height := range heights {
-				node, err := s.cctx.Context.GetNode()
+				node, err := s.cctx.GetNode()
 				require.NoError(t, err)
 				blockRes, err := node.Block(context.Background(), &height)
 				require.NoError(t, err)
-				size := blockRes.Block.Data.SquareSize
+				size := blockRes.Block.SquareSize
 
 				// perform basic checks on the size of the square
 				require.LessOrEqual(t, size, uint64(appconsts.DefaultGovMaxSquareSize))
 				require.GreaterOrEqual(t, size, uint64(appconsts.MinSquareSize))
 
-				require.EqualValues(t, appconsts.LatestVersion, blockRes.Block.Header.Version.App)
+				require.EqualValues(t, appconsts.LatestVersion, blockRes.Block.Version.App)
 
 				sizes = append(sizes, size)
 				ExtendBlockTest(t, blockRes.Block)
@@ -218,7 +218,7 @@ func (s *IntegrationTestSuite) TestShareInclusionProof() {
 	hashes := make([]string, len(txs))
 
 	for i, tx := range txs {
-		res, err := s.cctx.Context.BroadcastTxSync(tx)
+		res, err := s.cctx.BroadcastTxSync(tx)
 		require.NoError(t, err)
 		require.Equal(t, abci.CodeTypeOK, res.Code, res.RawLog)
 		hashes[i] = res.TxHash
@@ -231,12 +231,12 @@ func (s *IntegrationTestSuite) TestShareInclusionProof() {
 		require.NoError(t, err)
 		require.Equal(t, abci.CodeTypeOK, txResp.TxResult.Code)
 
-		node, err := s.cctx.Context.GetNode()
+		node, err := s.cctx.GetNode()
 		require.NoError(t, err)
 		blockRes, err := node.Block(context.Background(), &txResp.Height)
 		require.NoError(t, err)
 
-		require.EqualValues(t, appconsts.LatestVersion, blockRes.Block.Header.Version.App)
+		require.EqualValues(t, appconsts.LatestVersion, blockRes.Block.Version.App)
 
 		_, isBlobTx := coretypes.UnmarshalBlobTx(blockRes.Block.Txs[txResp.Index])
 		require.True(t, isBlobTx)
@@ -263,7 +263,7 @@ func (s *IntegrationTestSuite) TestShareInclusionProof() {
 // ExtendBlockTest re-extends the block and compares the data roots to ensure
 // that the public functions for extending the block are working correctly.
 func ExtendBlockTest(t *testing.T, block *coretypes.Block) {
-	eds, err := app.ExtendBlock(block.Data, block.Header.Version.App)
+	eds, err := app.ExtendBlock(block.Data, block.Version.App)
 	require.NoError(t, err)
 	dah, err := da.NewDataAvailabilityHeader(eds)
 	require.NoError(t, err)
@@ -292,7 +292,7 @@ func (s *IntegrationTestSuite) TestIsEmptyBlockRef() {
 	for _, h := range emptyHeights {
 		blockRes, err := s.cctx.Client.Block(s.cctx.GoContext(), &h)
 		require.NoError(t, err)
-		require.True(t, app.IsEmptyBlockRef(&blockRes.Block.Data, blockRes.Block.Header.Version.App))
+		require.True(t, app.IsEmptyBlockRef(&blockRes.Block.Data, blockRes.Block.Version.App))
 		ExtendBlockTest(t, blockRes.Block)
 	}
 }
diff --git a/app/test/square_size_test.go b/app/test/square_size_test.go
index b7d147fe..2d7bb3c1 100644
--- a/app/test/square_size_test.go
+++ b/app/test/square_size_test.go
@@ -130,10 +130,10 @@ func (s *SquareSizeIntegrationTest) TestSquareSizeUpperBound() {
 			for i := end - numBlocks; i < end; i++ {
 				block, err := s.cctx.Client.Block(s.cctx.GoContext(), &i)
 				require.NoError(t, err)
-				require.LessOrEqual(t, block.Block.Data.SquareSize, uint64(tt.govMaxSquareSize))
+				require.LessOrEqual(t, block.Block.SquareSize, uint64(tt.govMaxSquareSize))
 
-				if block.Block.Data.SquareSize > uint64(actualMaxSize) {
-					actualMaxSize = int(block.Block.Data.SquareSize)
+				if block.Block.SquareSize > uint64(actualMaxSize) {
+					actualMaxSize = int(block.Block.SquareSize)
 				}
 			}
 
diff --git a/pkg/appconsts/versioned_consts_test.go b/pkg/appconsts/versioned_consts_test.go
index 6b62a58d..01d453b4 100644
--- a/pkg/appconsts/versioned_consts_test.go
+++ b/pkg/appconsts/versioned_consts_test.go
@@ -112,16 +112,10 @@ func TestUpgradeHeightDelay(t *testing.T) {
 			version:                    v2.Version,
 			expectedUpgradeHeightDelay: v3.UpgradeHeightDelay, // falls back to v3 because of arabica bug
 		},
-		{
-			name:                       "v3 upgrade delay",
-			chainID:                    "mocha-4",
-			version:                    3,
-			expectedUpgradeHeightDelay: v3.UpgradeHeightDelay,
-		},
 		{
 			name:                       "the upgrade delay for chainID 'test' should be 3 regardless of the version",
 			chainID:                    appconsts.TestChainID,
-			version:                    3,
+			version:                    v3.Version,
 			expectedUpgradeHeightDelay: 3,
 		},
 		{
@@ -130,6 +124,30 @@ func TestUpgradeHeightDelay(t *testing.T) {
 			version:                    4,
 			expectedUpgradeHeightDelay: 3,
 		},
+		{
+			name:                       "v3 upgrade delay on arabica is 1 day",
+			chainID:                    appconsts.ArabicaChainID,
+			version:                    v3.Version,
+			expectedUpgradeHeightDelay: 14_400, // 1 day of 6 second blocks
+		},
+		{
+			name:                       "v3 upgrade delay on mocha is 2 days",
+			chainID:                    appconsts.MochaChainID,
+			version:                    v3.Version,
+			expectedUpgradeHeightDelay: 28_800, // 2 days of 6 second blocks
+		},
+		{
+			name:                       "v3 upgrade delay on mainnet is 7 days",
+			chainID:                    appconsts.MainnetChainID,
+			version:                    v3.Version,
+			expectedUpgradeHeightDelay: v3.UpgradeHeightDelay, // 7 days of 6 second blocks
+		},
+		{
+			name:                       "v4 upgrade delay on arabica is 7 days",
+			chainID:                    appconsts.ArabicaChainID,
+			version:                    4,
+			expectedUpgradeHeightDelay: v3.UpgradeHeightDelay, // TODO: this should panic
+		},
 	}
 
 	for _, tc := range tests {
diff --git a/pkg/inclusion/nmt_caching_test.go b/pkg/inclusion/nmt_caching_test.go
index 5e47ecf3..05bc170c 100644
--- a/pkg/inclusion/nmt_caching_test.go
+++ b/pkg/inclusion/nmt_caching_test.go
@@ -171,14 +171,7 @@ func calculateSubTreeRoots(t *testing.T, row [][]byte, depth int) [][]byte {
 func chunkSlice(slice [][]byte, chunkSize int) [][][]byte {
 	var chunks [][][]byte
 	for i := 0; i < len(slice); i += chunkSize {
-		end := i + chunkSize
-
-		// necessary check to avoid slicing beyond
-		// slice capacity
-		if end > len(slice) {
-			end = len(slice)
-		}
-
+		end := min(i+chunkSize, len(slice))
 		chunks = append(chunks, slice[i:end])
 	}
 
diff --git a/test/interchain/go.mod b/test/interchain/go.mod
index 44890bf4..9227ccdd 100644
--- a/test/interchain/go.mod
+++ b/test/interchain/go.mod
@@ -226,7 +226,7 @@ replace (
 replace (
 	github.com/cosmos/cosmos-sdk => github.com/celestiaorg/cosmos-sdk v1.27.0-sdk-v0.46.16
 	// Replace IBC with celestiaorg fork which includes fixes for security vulnerabilities.
-	github.com/cosmos/ibc-go/v6 => github.com/celestiaorg/ibc-go/v6 v6.2.4
+	github.com/cosmos/ibc-go/v6 => github.com/celestiaorg/ibc-go/v6 v6.2.5
 	github.com/docker/docker => github.com/docker/docker v24.0.1+incompatible
 	github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1
 	github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7
diff --git a/test/interchain/go.sum b/test/interchain/go.sum
index 6e4dfd78..244dc73d 100644
--- a/test/interchain/go.sum
+++ b/test/interchain/go.sum
@@ -253,8 +253,8 @@ github.com/celestiaorg/celestia-core v1.51.0-tm-v0.34.35 h1:B9CRRq3VtraIe3Jktqep
 github.com/celestiaorg/celestia-core v1.51.0-tm-v0.34.35/go.mod h1:SI38xqZZ4ccoAxszUJqsJ/a5rOkzQRijzHQQlLKkyUc=
 github.com/celestiaorg/cosmos-sdk v1.27.0-sdk-v0.46.16 h1:qxWiGrDEcg4FzVTpIXU/v3wjP7q1Lz4AMhSBBRABInU=
 github.com/celestiaorg/cosmos-sdk v1.27.0-sdk-v0.46.16/go.mod h1:W30mNt3+2l516HVR8Gt9+Gf4qOrWC9/x18MTEx2GljE=
-github.com/celestiaorg/ibc-go/v6 v6.2.4 h1:S9jH7e+faYWF9PgDQAQnHxgm+FeDWTKcOF99Zez40bA=
-github.com/celestiaorg/ibc-go/v6 v6.2.4/go.mod h1:XLsARy4Y7+GtAqzMcxNdlQf6lx+ti1e8KcMGv5NIK7A=
+github.com/celestiaorg/ibc-go/v6 v6.2.5 h1:mUmZptulQGsGgyBqmdBeSCPQtMu0aFMJstgvKhUdqy4=
+github.com/celestiaorg/ibc-go/v6 v6.2.5/go.mod h1:XLsARy4Y7+GtAqzMcxNdlQf6lx+ti1e8KcMGv5NIK7A=
 github.com/celestiaorg/nmt v0.23.0 h1:cfYy//hL1HeDSH0ub3CPlJuox5U5xzgg4JGZrw23I/I=
 github.com/celestiaorg/nmt v0.23.0/go.mod h1:kYfIjRq5rmA2mJnv41GLWkxn5KyLNPlma3v5Q68rHdI=
 github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4=
diff --git a/test/pfm/simapp.go b/test/pfm/simapp.go
index a9ec1ff8..a55e78f7 100644
--- a/test/pfm/simapp.go
+++ b/test/pfm/simapp.go
@@ -491,7 +491,7 @@ func NewSimApp(
 	app.mm = module.NewManager(
 		// SDK app modules
 		genutil.NewAppModule(
-			app.AccountKeeper, app.StakingKeeper, app.BaseApp.DeliverTx,
+			app.AccountKeeper, app.StakingKeeper, app.DeliverTx,
 			encodingConfig.TxConfig,
 		),
 		auth.NewAppModule(appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts),
@@ -780,14 +780,14 @@ func (app *SimApp) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APICon
 
 // RegisterTxService implements the Application.RegisterTxService method.
 func (app *SimApp) RegisterTxService(clientCtx client.Context) {
-	authtx.RegisterTxService(app.BaseApp.GRPCQueryRouter(), clientCtx, app.BaseApp.Simulate, app.interfaceRegistry)
+	authtx.RegisterTxService(app.GRPCQueryRouter(), clientCtx, app.Simulate, app.interfaceRegistry)
 }
 
 // RegisterTendermintService implements the Application.RegisterTendermintService method.
 func (app *SimApp) RegisterTendermintService(clientCtx client.Context) {
 	tmservice.RegisterTendermintService(
 		clientCtx,
-		app.BaseApp.GRPCQueryRouter(),
+		app.GRPCQueryRouter(),
 		app.interfaceRegistry,
 		app.Query,
 	)
diff --git a/test/txsim/blob.go b/test/txsim/blob.go
index 3fcef2fa..91a39fd2 100644
--- a/test/txsim/blob.go
+++ b/test/txsim/blob.go
@@ -123,8 +123,11 @@ type Range struct {
 	Max int
 }
 
-func NewRange(min, max int) Range {
-	return Range{Min: min, Max: max}
+func NewRange(minimum, maximum int) Range {
+	return Range{
+		Min: minimum,
+		Max: maximum,
+	}
 }
 
 // Rand returns a random number between min (inclusive) and max (exclusive).
diff --git a/test/util/common.go b/test/util/common.go
index 6d1b4625..75405824 100644
--- a/test/util/common.go
+++ b/test/util/common.go
@@ -289,12 +289,13 @@ func CreateTestEnvWithoutBlobstreamKeysInit(t *testing.T) TestInput {
 	for name, permissions := range moduleAccountPermissions {
 		moduleAccount := authtypes.NewEmptyModuleAccount(name, permissions...)
 		totalSupply := sdk.NewCoins(sdk.NewInt64Coin("stake", 100000000))
-		if name == stakingtypes.NotBondedPoolName {
+		switch name {
+		case stakingtypes.NotBondedPoolName:
 			err = bankKeeper.MintCoins(ctx, blobstreamtypes.ModuleName, totalSupply)
 			require.NoError(t, err)
 			err = bankKeeper.SendCoinsFromModuleToModule(ctx, blobstreamtypes.ModuleName, moduleAccount.Name, totalSupply)
 			require.NoError(t, err)
-		} else if name == distrtypes.ModuleName {
+		case distrtypes.ModuleName:
 			// some big pot to pay out
 			amt := sdk.NewCoins(sdk.NewInt64Coin("stake", 500000))
 			err = bankKeeper.MintCoins(ctx, blobstreamtypes.ModuleName, amt)
diff --git a/test/util/malicious/out_of_order_prepare.go b/test/util/malicious/out_of_order_prepare.go
index aeaa1c4f..705c82de 100644
--- a/test/util/malicious/out_of_order_prepare.go
+++ b/test/util/malicious/out_of_order_prepare.go
@@ -23,7 +23,7 @@ func (a *App) OutOfOrderPrepareProposal(req abci.RequestPrepareProposal) abci.Re
 		Height:  req.Height,
 		Time:    req.Time,
 		Version: version.Consensus{
-			App: a.BaseApp.AppVersion(),
+			App: a.AppVersion(),
 		},
 	})
 	// filter out invalid transactions.
diff --git a/test/util/test_app.go b/test/util/test_app.go
index 674be579..643ae573 100644
--- a/test/util/test_app.go
+++ b/test/util/test_app.go
@@ -272,7 +272,7 @@ func AddDeterministicValidatorsToGenesis(g *genesis.Genesis) error {
 		// Construct account from keyring account
 		account := genesis.Account{
 			PubKey:  validatorPubKey,
-			Balance: val.KeyringAccount.InitialTokens,
+			Balance: val.InitialTokens,
 			Name:    val.Name,
 		}
 
diff --git a/test/util/testnode/read.go b/test/util/testnode/read.go
index f4b5572a..7c8e5187 100644
--- a/test/util/testnode/read.go
+++ b/test/util/testnode/read.go
@@ -171,8 +171,8 @@ func CalculateMeanGas(ctx context.Context, rpcAddress, msgType string, fromHeigh
 		if err != nil {
 			return average(), count, err
 		}
-		indices := make([]int, 0, len(resp.Block.Data.Txs))
-		for i, rawTx := range resp.Block.Data.Txs {
+		indices := make([]int, 0, len(resp.Block.Txs))
+		for i, rawTx := range resp.Block.Txs {
 			tx, err := decoder(rawTx)
 			if err != nil {
 				return average(), count, fmt.Errorf("decoding tx (height: %d): %w", height, err)
diff --git a/x/mint/client/testutil/grpc_test.go b/x/mint/client/testutil/grpc_test.go
index 84f993d6..8d7d8f35 100644
--- a/x/mint/client/testutil/grpc_test.go
+++ b/x/mint/client/testutil/grpc_test.go
@@ -50,7 +50,7 @@ func (s *IntegrationTestSuite) TestQueryGRPC() {
 		s.Run(tc.name, func() {
 			resp, err := testutil.GetRequestWithHeaders(tc.url, tc.headers)
 			s.Require().NoError(err)
-			s.Require().NoError(s.cctx.Context.Codec.UnmarshalJSON(resp, tc.respType))
+			s.Require().NoError(s.cctx.Codec.UnmarshalJSON(resp, tc.respType))
 			s.Require().Equal(tc.expected.String(), tc.respType.String())
 		})
 	}
diff --git a/x/mint/module_test.go b/x/mint/module_test.go
index d7b124e3..779fb0c5 100644
--- a/x/mint/module_test.go
+++ b/x/mint/module_test.go
@@ -31,7 +31,7 @@ func TestItCreatesModuleAccountOnInitBlock(t *testing.T) {
 		},
 	)
 
-	ctx := app.BaseApp.NewContext(false, tmproto.Header{})
+	ctx := app.NewContext(false, tmproto.Header{})
 	acc := app.AccountKeeper.GetAccount(ctx, authtypes.NewModuleAddress(types.ModuleName))
 	require.NotNil(t, acc)
 }
diff --git a/x/mint/types/minter_test.go b/x/mint/types/minter_test.go
index bafe1989..b4a8046d 100644
--- a/x/mint/types/minter_test.go
+++ b/x/mint/types/minter_test.go
@@ -156,14 +156,14 @@ func TestCalculateBlockProvisionError(t *testing.T) {
 }
 
 func randomBlockInterval() time.Duration {
-	min := (14 * time.Second).Nanoseconds()
-	max := (16 * time.Second).Nanoseconds()
-	return time.Duration(randInRange(min, max))
+	minimum := (14 * time.Second).Nanoseconds()
+	maximum := (16 * time.Second).Nanoseconds()
+	return time.Duration(randInRange(minimum, maximum))
 }
 
 // randInRange returns a random number in the range (min, max) inclusive.
-func randInRange(min int64, max int64) int64 {
-	return rand.Int63n(max-min) + min
+func randInRange(minimum int64, maximum int64) int64 {
+	return minimum + rand.Int63n(maximum-minimum)
 }
 
 func BenchmarkCalculateBlockProvision(b *testing.B) {
diff --git a/x/paramfilter/test/gov_params_test.go b/x/paramfilter/test/gov_params_test.go
index 18609464..c098553e 100644
--- a/x/paramfilter/test/gov_params_test.go
+++ b/x/paramfilter/test/gov_params_test.go
@@ -38,7 +38,7 @@ type GovParamsTestSuite struct {
 
 func (suite *GovParamsTestSuite) SetupTest() {
 	suite.app, _ = testutil.SetupTestAppWithGenesisValSet(app.DefaultConsensusParams())
-	suite.ctx = suite.app.BaseApp.NewContext(false, tmproto.Header{})
+	suite.ctx = suite.app.NewContext(false, tmproto.Header{})
 	suite.govHandler = paramfilter.NewParamBlockList(suite.app.BlockedParams()...).GovHandler(suite.app.ParamsKeeper)
 }
 
@@ -171,11 +171,11 @@ func (suite *GovParamsTestSuite) TestModifiableParams() {
 				Value:    `{"max_bytes": "1", "max_gas": "2"}`,
 			}),
 			func() {
-				gotMaxBytes := suite.app.BaseApp.GetConsensusParams(suite.ctx).Block.MaxBytes
+				gotMaxBytes := suite.app.GetConsensusParams(suite.ctx).Block.MaxBytes
 				wantMaxBytes := int64(1)
 				assert.Equal(wantMaxBytes, gotMaxBytes)
 
-				gotMaxGas := suite.app.BaseApp.GetConsensusParams(suite.ctx).Block.MaxGas
+				gotMaxGas := suite.app.GetConsensusParams(suite.ctx).Block.MaxGas
 				wantMaxGas := int64(2)
 				assert.Equal(wantMaxGas, gotMaxGas)
 			},
@@ -188,15 +188,15 @@ func (suite *GovParamsTestSuite) TestModifiableParams() {
 				Value:    `{"max_age_duration": "1", "max_age_num_blocks": "2", "max_bytes": "3"}`,
 			}),
 			func() {
-				gotMaxAgeDuration := suite.app.BaseApp.GetConsensusParams(suite.ctx).Evidence.MaxAgeDuration
+				gotMaxAgeDuration := suite.app.GetConsensusParams(suite.ctx).Evidence.MaxAgeDuration
 				wantMaxAgeDuration := time.Duration(1)
 				assert.Equal(wantMaxAgeDuration, gotMaxAgeDuration)
 
-				gotMaxAgeNumBlocks := suite.app.BaseApp.GetConsensusParams(suite.ctx).Evidence.MaxAgeNumBlocks
+				gotMaxAgeNumBlocks := suite.app.GetConsensusParams(suite.ctx).Evidence.MaxAgeNumBlocks
 				wantMaxAgeNumBlocks := int64(2)
 				assert.Equal(wantMaxAgeNumBlocks, gotMaxAgeNumBlocks)
 
-				gotMaxBytes := suite.app.BaseApp.GetConsensusParams(suite.ctx).Evidence.MaxBytes
+				gotMaxBytes := suite.app.GetConsensusParams(suite.ctx).Evidence.MaxBytes
 				wantMaxBytes := int64(3)
 				assert.Equal(wantMaxBytes, gotMaxBytes)
 			},
diff --git a/x/signal/keeper_test.go b/x/signal/keeper_test.go
index 2cefad5b..e93a98a8 100644
--- a/x/signal/keeper_test.go
+++ b/x/signal/keeper_test.go
@@ -426,7 +426,7 @@ func TestGetUpgrade(t *testing.T) {
 		got, err := upgradeKeeper.GetUpgrade(ctx, &types.QueryGetUpgradeRequest{})
 		require.NoError(t, err)
 		assert.Equal(t, v2.Version, got.Upgrade.AppVersion)
-		assert.Equal(t, appconsts.UpgradeHeightDelay(appconsts.TestChainID, v2.Version), got.Upgrade.UpgradeHeight)
+		assert.Equal(t, appconsts.UpgradeHeightDelay(appconsts.TestChainID, v1.Version), got.Upgrade.UpgradeHeight)
 	})
 }