From db3c40eeabbe5ee809da5f0dabb1a5820d29360b Mon Sep 17 00:00:00 2001 From: Vishal Potpelliwar <71565171+vishal-kanna@users.noreply.github.com> Date: Thu, 17 Oct 2024 13:26:31 +0530 Subject: [PATCH] fix: Restore upgrade testing suite for v3.x line (#789) * chore: updated anteHandler and postHandler * chore: use replace for feemarket in go.mod * chore: changed go version in docker file * fix : fix testing in antehandler * fix: fix lint issues * chore: updated antehandler * fix: fix lint issues * fix: fix lint issues * fix: lint issus * chore: updated ante and fix test cases * fix: gofumt errors * fix: golint issues * chore: updated postHandler * testing * chore: added test cases * fix * fix * fix: golint issues * fix : fix testcase * fix: fix lint issues * disable update tests * disable report test * fix: added response check in tests * fix * chore: added param subsace for feemarket * addressed review comments * fix * fix * fix * TODO in app.go * fix: golint error * feat: add msg mint * fix lint * chore: added tests for mintMsg * Temporarily disabled upgrade test runs + references * chore: added upgradeHandler and upgraded the store loader * chore: added integration test for mint msg * fix: gofumpt issue * fix: lint issue * Removed stale replacement statement * fixes * fix * testing * lint fix * fix * remove build tag * fix:gas issue * fix tests * fix: fix lint * added gobuild tag * testing * fix: lint fix * testing * reverted setup.sh * reverted scripts * reverted gobuild tags * testing * testing * testing * testing * test * try fixing mint * try fixing test * try fix * try fix * try fix * try trace * testing * testing * try fix * testing * try fix * testing * fix tests * fix tests * try fix * try fix * fix lint * push integartion build * keys tests * add query * lint * go build tag * try fix * cheqd home * added keys query * lint-fix * testing * home flag * added logs * testing * testing * testing * testing * tests * add git flow * try fix * try fix * docker * mainnet * remove keys list * fix setup * fix * ci * ci * ci * remove home path * tests * tests * tests * ci * tests * add home * changes * changes * try fix * try fix * fix test * testing * testing * testing * fix lint * fix * restored build tag * testing * fix * added queryBalance to test minting * buildtag * fix * chore: addressed review comments * nits * nit * revert * reverted functions * uncommented upgrade tests * chore: added module version for feemarket and feeabs * reordered versionmaps * testing * testing * build tag * testing * testing * testing * testing * changed balances * reverted balances * feemarketParams * updated to v3 * fix * updated old scripts * testing * testing * testing * remove build tag * commented validator3 * changed voting period * build tag * testing * query * voting period * testing * testing * testing * testing * testing * testing * testing * testing * testing * testing * testing * removed print statement * lint fix * chore: addressed review comments * restored GetproposalID func * restored function * fix: lint * restored paramchange in github workflows * Removed trailing space * testing * uncommented pricing proposal jobs * testing * testing * testing * fix : lint * testing * testing * testing * testing * testing * fix:lint * testing * testing * testing * testing * testing * increase timeout * testing * testing * added upgrade tests * fix:lint * added module version map * chore: added balance check after minting * fix * Enhanced report inclusion * Removed redundant * Restored relationships * Aligned v3 with v2 + removed redundancy * Added intermediate block producal periods * Added extra overhead * Adjusted literals + dynamic identifiers * Removed redundant * Debug * Debug v2 * Enhanced coded registry * Added directive * Debug v3 * Debug * Switched to constant since given order of precedence * chore: added query to extract address * debug * reduce waiting time * reduce waiting period * debug * reduce waiting time * debug * debug * debug * debug * debug * debug * fix: Added explicit did module account permission setter within upgrade handler (#805) * testing * Aligned literals --------- Co-authored-by: Tasos Derisiotis <50984242+Eengineer1@users.noreply.github.com> * Removed prints --------- Co-authored-by: atheesh Co-authored-by: Tasos Derisiotis <50984242+Eengineer1@users.noreply.github.com> Co-authored-by: Atheesh Padala <59333759+atheeshp@users.noreply.github.com> --- .github/workflows/test.yml | 313 +++++++++--------- app/app.go | 20 ++ docker/localnet/docker-compose.yml | 2 +- .../localnet/gen-network-config-old-binary.sh | 19 +- docker/localnet/mainnet-latest.env | 2 +- tests/integration/cli/query.go | 71 ++++ tests/integration/cli/tx.go | 66 ---- .../cli_diddoc_pricing_negative_test.go | 1 - tests/integration/cli_mint_proposal_test.go | 47 ++- tests/integration/helpers/codec.go | 4 + tests/upgrade/integration/scripts/setup.sh | 11 + tests/upgrade/integration/v2/cli/query.go | 45 +++ .../post/query - module-version-map/v2.json | 200 +++++------ .../v2/param_change_proposal_test.go | 42 ++- tests/upgrade/integration/v2/pre_test.go | 21 +- .../integration/v2/upgrade_suite_test.go | 2 - tests/upgrade/integration/v3/cli/config.go | 2 +- tests/upgrade/integration/v3/cli/helpers.go | 2 +- tests/upgrade/integration/v3/cli/query.go | 77 +++++ .../post/query - module-version-map/v3.json | 111 +++++++ .../diddoc_indy_ed255192018.json | 25 ++ .../diddoc_indy_ed255192020.json | 25 ++ .../diddoc_indy_jsonwebkey2020.json | 29 ++ .../diddoc_uuid_ed255192018.json | 25 ++ .../diddoc_uuid_ed255192020.json | 25 ++ .../diddoc_uuid_jsonwebkey2020.json | 29 ++ .../resource_indy_ed255192018.json | 15 + .../resource_indy_ed255192020.json | 15 + .../resource_indy_jsonwebkey2020.json | 15 + .../resource_uuid_ed255192018.json | 15 + .../resource_uuid_ed255192020.json | 15 + .../resource_uuid_jsonwebkey2020.json | 15 + .../pre/query - module-version-map/v1.json | 96 ++++++ .../pre/signinputs/indy_ed255192018.json | 6 + .../pre/signinputs/indy_ed255192020.json | 6 + .../pre/signinputs/indy_jsonwebkey2020.json | 6 + .../pre/signinputs/uuid_ed255192018.json | 6 + .../pre/signinputs/uuid_ed255192020.json | 6 + .../pre/signinputs/uuid_jsonwebkey2020.json | 6 + tests/upgrade/integration/v3/glob.go | 18 + ...mint_proposal.go => mint_proposal_test.go} | 2 +- tests/upgrade/integration/v3/post_test.go | 172 ++++++++++ tests/upgrade/integration/v3/pre_test.go | 231 +++++++++++++ tests/upgrade/integration/v3/proposal.json | 14 + .../integration/v3/upgrade_suite_test.go | 2 - 45 files changed, 1508 insertions(+), 369 deletions(-) create mode 100644 tests/upgrade/integration/v3/generated/post/query - module-version-map/v3.json create mode 100644 tests/upgrade/integration/v3/generated/pre/create - diddoc/diddoc_indy_ed255192018.json create mode 100644 tests/upgrade/integration/v3/generated/pre/create - diddoc/diddoc_indy_ed255192020.json create mode 100644 tests/upgrade/integration/v3/generated/pre/create - diddoc/diddoc_indy_jsonwebkey2020.json create mode 100644 tests/upgrade/integration/v3/generated/pre/create - diddoc/diddoc_uuid_ed255192018.json create mode 100644 tests/upgrade/integration/v3/generated/pre/create - diddoc/diddoc_uuid_ed255192020.json create mode 100644 tests/upgrade/integration/v3/generated/pre/create - diddoc/diddoc_uuid_jsonwebkey2020.json create mode 100644 tests/upgrade/integration/v3/generated/pre/create - resource/resource_indy_ed255192018.json create mode 100644 tests/upgrade/integration/v3/generated/pre/create - resource/resource_indy_ed255192020.json create mode 100644 tests/upgrade/integration/v3/generated/pre/create - resource/resource_indy_jsonwebkey2020.json create mode 100644 tests/upgrade/integration/v3/generated/pre/create - resource/resource_uuid_ed255192018.json create mode 100644 tests/upgrade/integration/v3/generated/pre/create - resource/resource_uuid_ed255192020.json create mode 100644 tests/upgrade/integration/v3/generated/pre/create - resource/resource_uuid_jsonwebkey2020.json create mode 100644 tests/upgrade/integration/v3/generated/pre/query - module-version-map/v1.json create mode 100644 tests/upgrade/integration/v3/generated/pre/signinputs/indy_ed255192018.json create mode 100644 tests/upgrade/integration/v3/generated/pre/signinputs/indy_ed255192020.json create mode 100644 tests/upgrade/integration/v3/generated/pre/signinputs/indy_jsonwebkey2020.json create mode 100644 tests/upgrade/integration/v3/generated/pre/signinputs/uuid_ed255192018.json create mode 100644 tests/upgrade/integration/v3/generated/pre/signinputs/uuid_ed255192020.json create mode 100644 tests/upgrade/integration/v3/generated/pre/signinputs/uuid_jsonwebkey2020.json create mode 100644 tests/upgrade/integration/v3/glob.go rename tests/upgrade/integration/v3/{mint_proposal.go => mint_proposal_test.go} (99%) create mode 100644 tests/upgrade/integration/v3/post_test.go create mode 100644 tests/upgrade/integration/v3/pre_test.go create mode 100644 tests/upgrade/integration/v3/proposal.json diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9913f654c..45f1c47fb 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,7 +12,6 @@ permissions: checks: write jobs: - installer-cosmovisor: name: "Installer - Cosmovisor mode" runs-on: ubuntu-20.04 @@ -165,145 +164,141 @@ jobs: name: report-integration.xml path: report-integration.xml - # NOTE: This job is disabled since upgrade tests from v0.6.x to v1.x.x are not needed until next major release. - # upgrade-tests: - # name: "Upgrade Tests" - # runs-on: ubuntu-20.04 - # steps: - # - uses: actions/checkout@v4 - - # # Preparations - - # - name: Download old node binary (mainnet-latest) - # run: | - # mkdir -p ${{ env.RUNNER_BIN_DIR }} - # wget -c https://github.com/cheqd/cheqd-node/releases/download/v"${LEGACY_VERSION}"/cheqd-noded-"${LEGACY_VERSION}"-linux-amd64.tar.gz - # tar -xvf cheqd-noded-"${LEGACY_VERSION}"-linux-amd64.tar.gz -C ${{ env.RUNNER_BIN_DIR }} - # sudo chmod +x ${{ env.RUNNER_BIN_DIR }}/cheqd-noded - # env: - # LEGACY_VERSION: 1.4.5 - - # - name: Login to GitHub Container Registry - # uses: docker/login-action@v3 - # with: - # registry: ghcr.io - # username: ${{ github.actor }} - # password: ${{ secrets.GITHUB_TOKEN }} - - # - uses: actions/setup-go@v5 - # with: - # go-version-file: ./go.mod - # cache: true - - # - name: Install ginkgo - # working-directory: ./.. - # run: go install github.com/onsi/ginkgo/v2/ginkgo@latest - - # - name: Download new version of the Docker image (build-latest) - # uses: actions/download-artifact@v4 - # with: - # name: cheqd-node-build.tar - - # - name: Load node Docker image - # run: docker load -i cheqd-node-build.tar - - # # Run tests - # - name: Setting up network with old binary inside (mainnet version) - # working-directory: ./tests/upgrade/integration - # run: | - # bash scripts/old_binary_setup.sh - - # - name: Run pre-upgrade tests - # working-directory: ./tests/upgrade/integration/v2 - # run: | - # ginkgo -r --race --tags upgrade_integration --focus-file pre_test.go --keep-going --trace --junit-report ../../../../report-pre-upgrade.xml - - # - name: Upload pre-upgrade tests result - # uses: actions/upload-artifact@v4 - # with: - # name: report-pre-upgrade.xml - # path: report-pre-upgrade.xml - - # - name: Restart network using new node version (build-latest) - # working-directory: ./tests/upgrade/integration - # run: | - # bash scripts/upgrade.sh - - # - name: Verifying docker processes - # working-directory: ./tests/upgrade/integration - # run: | - # docker ps -a - - # - name: Run post-upgrade tests - # working-directory: ./tests/upgrade/integration/v2 - # run: | - # ginkgo -r --race --tags upgrade_integration --focus-file post_test.go --keep-going --trace --junit-report ../../../../report-post-upgrade.xml - - # - name: Upload post-upgrade tests result - # uses: actions/upload-artifact@v4 - # with: - # name: report-post-upgrade.xml - # path: report-post-upgrade.xml - - # - name: Download binary artifact (build-latest) - # uses: actions/download-artifact@v4 - # id: download - # with: - # name: cheqd-noded - # path: ${{ env.RUNNER_BIN_DIR }} - - # - name: Restore binary permissions - # run: sudo chmod +x ${{ env.RUNNER_BIN_DIR }}/cheqd-noded - - # - name: Run integration tests on upgraded network - # working-directory: ./tests/integration - # run: | - # ginkgo -r --tags integration --race --randomize-suites --keep-going --trace --junit-report ../../report-upgraded-integration.xml - - # - name: Upload post-upgrade integration tests result - # uses: actions/upload-artifact@v4 - # with: - # name: report-upgraded-integration.xml - # path: report-upgraded-integration.xml - - # - name: Show logs on failure - # if: failure() - # working-directory: ./docker/localnet - # run: docker compose --env-file build-latest.env logs --tail --follow - - # - name: Submit governance fee parameter change proposals - # working-directory: ./tests/upgrade/integration/v2 - # run: | - # ginkgo -r --race --tags upgrade_integration --focus-file param_change_proposal_test.go --keep-going --trace --junit-report ../../../../report-pricing-proposal.xml - - # - name: Upload pricing proposal tests result - # uses: actions/upload-artifact@v4 - # with: - # name: report-pricing-proposal.xml - # path: report-pricing-proposal.xml - - # - name: Run pricing integration tests after successful param change proposal - # working-directory: ./tests/integration - # run: | - # ginkgo -r --tags integration --race --randomize-suites --keep-going --trace --skip-file cli_diddoc_test.go --skip-file cli_diddoc_negative_test.go --skip-file cli_resource_test.go --skip-file cli_resource_negative_test.go --junit-report ../../report-pricing-change.xml - - # - name: Upload pricing change tests result - # uses: actions/upload-artifact@v4 - # with: - # name: report-pricing-change.xml - # path: report-pricing-change.xml - - # - name: Cleanup after tests - # working-directory: ./tests/upgrade/integration - # run: | - # bash scripts/cleanup.sh + upgrade-tests: + name: "Upgrade Tests" + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v4 + + - name: Download old node binary (mainnet-latest) + run: | + mkdir -p ${{ env.RUNNER_BIN_DIR }} + wget -c https://github.com/cheqd/cheqd-node/releases/download/v"${LEGACY_VERSION}"/cheqd-noded-"${LEGACY_VERSION}"-linux-amd64.tar.gz + tar -xvf cheqd-noded-"${LEGACY_VERSION}"-linux-amd64.tar.gz -C ${{ env.RUNNER_BIN_DIR }} + sudo chmod +x ${{ env.RUNNER_BIN_DIR }}/cheqd-noded + env: + LEGACY_VERSION: 2.0.1 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - uses: actions/setup-go@v5 + with: + go-version-file: ./go.mod + cache: true + + - name: Install ginkgo + working-directory: ./.. + run: go install github.com/onsi/ginkgo/v2/ginkgo@latest + + - name: Download new version of the Docker image (build-latest) + uses: actions/download-artifact@v4 + with: + name: cheqd-node-build.tar + + - name: Load node Docker image + run: docker load -i cheqd-node-build.tar + + - name: Setting up network with old binary inside (mainnet version) + working-directory: ./tests/upgrade/integration + run: | + bash scripts/old_binary_setup.sh + + - name: Run pre-upgrade tests + working-directory: ./tests/upgrade/integration/v3 + run: | + ginkgo -r --race --tags upgrade_integration --focus-file pre_test.go --keep-going --trace --junit-report ../../../../report-pre-upgrade.xml + + - name: Upload pre-upgrade tests result + uses: actions/upload-artifact@v4 + with: + name: report-pre-upgrade.xml + path: report-pre-upgrade.xml + + - name: Restart network using new node version (build-latest) + working-directory: ./tests/upgrade/integration + run: | + bash scripts/upgrade.sh + + - name: Verifying docker processes + working-directory: ./tests/upgrade/integration + run: | + docker ps -a + + - name: Run post-upgrade tests + working-directory: ./tests/upgrade/integration/v3 + run: | + ginkgo -r --race --tags upgrade_integration --focus-file post_test.go --keep-going --trace --junit-report ../../../../report-post-upgrade.xml + + - name: Upload post-upgrade tests result + uses: actions/upload-artifact@v4 + with: + name: report-post-upgrade.xml + path: report-post-upgrade.xml + + - name: Download binary artifact (build-latest) + uses: actions/download-artifact@v4 + id: download + with: + name: cheqd-noded + path: ${{ env.RUNNER_BIN_DIR }} + + - name: Restore binary permissions + run: sudo chmod +x ${{ env.RUNNER_BIN_DIR }}/cheqd-noded + + - name: Run integration tests on upgraded network + working-directory: ./tests/integration + run: | + ginkgo -r --tags integration --race --randomize-suites --keep-going --trace --junit-report ../../report-upgraded-integration.xml + + - name: Upload post-upgrade integration tests result + uses: actions/upload-artifact@v4 + with: + name: report-upgraded-integration.xml + path: report-upgraded-integration.xml + + - name: Show logs on failure + if: failure() + working-directory: ./docker/localnet + run: docker compose --env-file build-latest.env logs --tail --follow + + - name: Submit governance fee parameter change proposals + working-directory: ./tests/upgrade/integration/v2 + run: | + ginkgo -r --race --tags upgrade_integration --focus-file param_change_proposal_test.go --keep-going --trace --junit-report ../../../../report-pricing-proposal.xml + + - name: Upload pricing proposal tests result + uses: actions/upload-artifact@v4 + with: + name: report-pricing-proposal.xml + path: report-pricing-proposal.xml + + - name: Run pricing integration tests after successful param change proposal + working-directory: ./tests/integration + run: | + ginkgo -r --tags integration --race --randomize-suites --keep-going --trace --skip-file cli_diddoc_test.go --skip-file cli_diddoc_negative_test.go --skip-file cli_resource_test.go --skip-file cli_resource_negative_test.go --junit-report ../../report-pricing-change.xml + + - name: Upload pricing change tests result + uses: actions/upload-artifact@v4 + with: + name: report-pricing-change.xml + path: report-pricing-change.xml + + - name: Cleanup after tests + working-directory: ./tests/upgrade/integration + run: | + bash scripts/cleanup.sh report-results: name: "Report" runs-on: ubuntu-20.04 # NOTE: If not next major release, only unit and integration tests are necessary, otherwise all tests are needed. - needs: [unit-tests, integration-tests] - # needs: [unit-tests, integration-tests, upgrade-tests] + # needs: [unit-tests, integration-tests] + needs: [unit-tests, integration-tests, upgrade-tests] if: always() steps: @@ -319,41 +314,39 @@ jobs: with: name: report-integration.xml - # - name: Download pre-upgrade test Report - # uses: actions/download-artifact@v4 - # with: - # name: report-pre-upgrade.xml - - # - name: Download post-upgrade test Report - # uses: actions/download-artifact@v4 - # with: - # name: report-post-upgrade.xml - - # - name: Download upgraded integration test Report - # uses: actions/download-artifact@v4 - # with: - # name: report-upgraded-integration.xml + - name: Download pre-upgrade test Report + uses: actions/download-artifact@v4 + with: + name: report-pre-upgrade.xml - # - name: Download pricing proposal test Report - # uses: actions/download-artifact@v4 - # with: - # name: report-pricing-proposal.xml + - name: Download post-upgrade test Report + uses: actions/download-artifact@v4 + with: + name: report-post-upgrade.xml - # - name: Download pricing change test Report - # uses: actions/download-artifact@v4 - # with: - # name: report-pricing-change.xml + - name: Download upgraded integration test Report + uses: actions/download-artifact@v4 + with: + name: report-upgraded-integration.xml + - name: Download pricing proposal test Report + uses: actions/download-artifact@v4 + with: + name: report-pricing-proposal.xml + - name: Download pricing change test Report + uses: actions/download-artifact@v4 + with: + name: report-pricing-change.xml - name: Combine test results run: | - # python ./.github/scripts/xml_combine.py report-unit.xml report-integration.xml + python ./.github/scripts/xml_combine.py report-unit.xml report-integration.xml report-pre-upgrade.xml report-post-upgrade.xml report-upgraded-integration.xml report-pricing-proposal.xml report-pricing-change.xml > report.xml # run: | # python ./.github/scripts/xml_combine.py report-unit.xml report-integration.xml > report.xml - uses: mikepenz/action-junit-report@v4 with: - report_paths: 'report.xml' + report_paths: "report.xml" check_name: "" - suite_regex: '*' + suite_regex: "*" include_passed: true detailed_summary: true diff --git a/app/app.go b/app/app.go index 45f28c833..3d1573d66 100644 --- a/app/app.go +++ b/app/app.go @@ -1131,6 +1131,7 @@ func (app *App) RegisterUpgradeHandlers() { if err != nil { return migrations, err } + SetExplicitModuleAccountPermissions(ctx, app.AccountKeeper) err = ConfigureFeeMarketModule(ctx, app.FeeMarketKeeper) if err != nil { return migrations, err @@ -1151,6 +1152,7 @@ func (app *App) setupUpgradeStoreLoaders() { storeUpgrades := storetypes.StoreUpgrades{ Added: []string{ feemarkettypes.StoreKey, + feeabstypes.StoreKey, }, } // configure store loader that checks if version == upgradeHeight and applies store upgrades @@ -1186,3 +1188,21 @@ func ConfigureFeeMarketModule(ctx sdk.Context, keeper *feemarketkeeper.Keeper) e func (app *App) Configurator() module.Configurator { return app.configurator } + +func SetExplicitModuleAccountPermissions(ctx sdk.Context, accountKeeper authkeeper.AccountKeeper) { + // Get the module account using the account name + moduleAcc := accountKeeper.GetModuleAccount(ctx, didtypes.ModuleName) + // Ensure the account exists + if moduleAcc == nil { + panic("module account not found") + } + // Update the permissions (replace with the actual permissions) + newPermissions := []string{authtypes.Minter, authtypes.Burner} // Example permissions + // Cast the account to the concrete type that has permissions + if macc, ok := moduleAcc.(*authtypes.ModuleAccount); ok { + macc.Permissions = newPermissions + accountKeeper.SetModuleAccount(ctx, macc) // Update the account in the keeper + } else { + panic("failed to cast module account to *ModuleAccount") + } +} diff --git a/docker/localnet/docker-compose.yml b/docker/localnet/docker-compose.yml index 255b52dce..759f58450 100644 --- a/docker/localnet/docker-compose.yml +++ b/docker/localnet/docker-compose.yml @@ -276,4 +276,4 @@ volumes: validator-2-data: validator-3-data: seed-0-data: - observer-0-data: + observer-0-data: \ No newline at end of file diff --git a/docker/localnet/gen-network-config-old-binary.sh b/docker/localnet/gen-network-config-old-binary.sh index 2c14ded29..5fe1b7bf4 100644 --- a/docker/localnet/gen-network-config-old-binary.sh +++ b/docker/localnet/gen-network-config-old-binary.sh @@ -139,7 +139,7 @@ function configure_genesis() { mv "${GENESIS_TMP}" "${GENESIS}" # supplied added tokens - # jq '.app_state.bank.supply += [{"denom": "ncheq", "amount": "420004000000000200"}]' "$GENESIS" > "$GENESIS_TMP" && mv "${GENESIS_TMP}" "${GENESIS}" + jq '.app_state.bank.supply += [{"denom": "ncheq", "amount": "420004000000000200"}]' "$GENESIS" > "$GENESIS_TMP" && mv "${GENESIS_TMP}" "${GENESIS}" } @@ -186,6 +186,13 @@ configure_genesis "${TMP_NODE_HOME}" "${TMP_NODE_MONIKER}" mkdir "${TMP_NODE_HOME}/config/gentx" +mnemonics=( + "mix around destroy web fever address comfort vendor tank sudden abstract cabin acoustic attitude peasant hospital vendor harsh void current shield couple barrel suspect" + "useful case library girl narrow plate knee side supreme base horror fence tent glass leaf okay budget chalk patch forum coil crunch employ need" + "slight oblige answer vault project symbol dismiss match match honey forum wood resist exotic inner close foil notice onion acquire sausage boost acquire produce" + "prefer spring subject mimic shadow biology connect option east dirt security surge thrive kiwi nothing pulse holiday license hub pitch motion sunny pelican birth" +) + # Adding genesis validators for ((i=0 ; i