diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/starship-e2e-tests.yml
similarity index 86%
rename from .github/workflows/e2e-tests.yml
rename to .github/workflows/starship-e2e-tests.yml
index 91460cec..35dbf7ce 100644
--- a/.github/workflows/e2e-tests.yml
+++ b/.github/workflows/starship-e2e-tests.yml
@@ -1,9 +1,10 @@
-name: E2E tests
+name: Starship E2E tests
on:
push:
branches:
- main
+ - anmol/trim-starship-integration
pull_request:
branches:
- main
@@ -23,6 +24,11 @@ jobs:
go-version: ^1.20
id: go
+ - name: Deps
+ run: |
+ cd tests/starship/
+ go mod tidy
+
# Starship Infra setup
# - Connects to k8s cluster with kubeconfig (digital ocean)
# - Creates a new namespace based on the name (deleted in next step)
@@ -31,20 +37,18 @@ jobs:
# - Port forward all ports to localhost for next steps to connect
- name: Setup Test infra
id: starship-action
- uses: cosmology-tech/starship-action@0.2.12
+ uses: cosmology-tech/starship-action@0.2.15
with:
values: tests/starship/configs/ci.yaml
port-forward: true
- version: 0.1.39-rc5
+ version: 0.1.46-rc1
- name: Run Tests
run: |
cd tests/starship/
- go mod tidy
make test
# Starship resource cleanup on cluster
- # todo(@anmol1696): change this to be post step of the action
- name: Cleanup cluster
if: always()
run: |
diff --git a/demo/app/app.go b/demo/app/app.go
index fb17fcf0..40e3e1a5 100644
--- a/demo/app/app.go
+++ b/demo/app/app.go
@@ -112,7 +112,7 @@ import (
ibcfee "github.com/cosmos/ibc-go/v7/modules/apps/29-fee"
ibcfeekeeper "github.com/cosmos/ibc-go/v7/modules/apps/29-fee/keeper"
ibcfeetypes "github.com/cosmos/ibc-go/v7/modules/apps/29-fee/types"
- transfer "github.com/cosmos/ibc-go/v7/modules/apps/transfer"
+ "github.com/cosmos/ibc-go/v7/modules/apps/transfer"
ibctransferkeeper "github.com/cosmos/ibc-go/v7/modules/apps/transfer/keeper"
ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types"
ibc "github.com/cosmos/ibc-go/v7/modules/core"
@@ -871,12 +871,6 @@ func NewMeshApp(
if err := app.WasmKeeper.InitializePinnedCodes(ctx); err != nil {
tmos.Exit(fmt.Sprintf("failed initialize pinned codes %s", err))
}
-
- // todo: remove set-params and initialize via genesis
- if err := app.MeshSecKeeper.SetParams(ctx, meshsectypes.DefaultParams(sdk.DefaultBondDenom)); err != nil {
- tmos.Exit(fmt.Sprintf("failed to set mesh params: %s", err))
- }
-
}
return app
@@ -1094,6 +1088,7 @@ func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino
paramsKeeper.Subspace(icahosttypes.SubModuleName)
paramsKeeper.Subspace(icacontrollertypes.SubModuleName)
paramsKeeper.Subspace(wasm.ModuleName)
+ paramsKeeper.Subspace(meshsectypes.ModuleName)
return paramsKeeper
}
diff --git a/docs/proto/proto-docs.md b/docs/proto/proto-docs.md
index c43a980e..1841ad19 100644
--- a/docs/proto/proto-docs.md
+++ b/docs/proto/proto-docs.md
@@ -8,6 +8,9 @@
- [Params](#osmosis.meshsecurity.v1beta1.Params)
- [VirtualStakingMaxCapInfo](#osmosis.meshsecurity.v1beta1.VirtualStakingMaxCapInfo)
+- [osmosis/meshsecurity/v1beta1/genesis.proto](#osmosis/meshsecurity/v1beta1/genesis.proto)
+ - [GenesisState](#osmosis.meshsecurity.v1beta1.GenesisState)
+
- [osmosis/meshsecurity/v1beta1/query.proto](#osmosis/meshsecurity/v1beta1/query.proto)
- [QueryParamsRequest](#osmosis.meshsecurity.v1beta1.QueryParamsRequest)
- [QueryParamsResponse](#osmosis.meshsecurity.v1beta1.QueryParamsResponse)
@@ -69,6 +72,37 @@ virtual staking max cap
+
+
+
+
+
+
+
+
+
+
+
+
Top
+
+## osmosis/meshsecurity/v1beta1/genesis.proto
+
+
+
+
+
+### GenesisState
+GenesisState defines meshsecurity module's genesis state.
+
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| `params` | [Params](#osmosis.meshsecurity.v1beta1.Params) | | |
+
+
+
+
+
diff --git a/proto/osmosis/meshsecurity/v1beta1/genesis.proto b/proto/osmosis/meshsecurity/v1beta1/genesis.proto
new file mode 100644
index 00000000..3b70c15c
--- /dev/null
+++ b/proto/osmosis/meshsecurity/v1beta1/genesis.proto
@@ -0,0 +1,18 @@
+syntax = "proto3";
+package osmosis.meshsecurity.v1beta1;
+
+import "osmosis/meshsecurity/v1beta1/meshsecurity.proto";
+import "gogoproto/gogo.proto";
+import "amino/amino.proto";
+
+option go_package = "github.com/osmosis-labs/mesh-security-sdk/x/meshsecurity/types";
+option (gogoproto.goproto_getters_all) = false;
+option (gogoproto.equal_all) = false;
+
+// GenesisState defines meshsecurity module's genesis state.
+message GenesisState {
+ option (gogoproto.equal) = true;
+
+ Params params = 1
+ [ (gogoproto.nullable) = false, (amino.dont_omitempty) = true ];
+}
diff --git a/tests/starship/Makefile b/tests/starship/Makefile
index 4cce7442..af4ce55e 100644
--- a/tests/starship/Makefile
+++ b/tests/starship/Makefile
@@ -25,26 +25,21 @@ build-linux:
### Starship Helm Charts ###
###############################################################################
NAME = mesh-security
-FILE = configs/starship.yaml
+FILE = configs/local.yaml
HELM_REPO = starship
HELM_CHART = devnet
-HELM_VERSION = v0.1.39-rc5
+HELM_VERSION = v0.1.46-rc1
.PHONY: check
setup-deps:
bash $(CURDIR)/scripts/dev-setup.sh
-setup-helm:
- helm repo add $(HELM_REPO) https://cosmology-tech.github.io/starship/
- helm repo update
- helm search repo $(HELM_REPO)/$(HELM_CHART) --version $(HELM_VERSION)
-
install:
- helm install -f $(FILE) $(NAME) $(HELM_REPO)/$(HELM_CHART) --version $(HELM_VERSION)
+ bash $(CURDIR)/scripts/install.sh --config $(FILE) --version $(HELM_VERSION) --name $(NAME)
debug:
- helm install -f $(FILE) $(NAME) $(HELM_REPO)/$(HELM_CHART) --version $(HELM_VERSION) --dry-run --debug
+ bash $(CURDIR)/scripts/install.sh --config $(FILE) --version $(HELM_VERSION) --name $(NAME) --dry-run
delete:
-helm delete $(NAME)
diff --git a/tests/starship/configs/ci.yaml b/tests/starship/configs/ci.yaml
index 10e1c4aa..03019c03 100644
--- a/tests/starship/configs/ci.yaml
+++ b/tests/starship/configs/ci.yaml
@@ -1,16 +1,24 @@
chains:
- - name: mesh-osmosis-1
+ - name: mesh-1
type: custom
numValidators: 1
- image: anmol1696/meshd:osmo
+ image: anmol1696/meshd:latest
home: /root/.meshd
binary: meshd
- prefix: osmo
- denom: uosmo
- coins: 100000000000000uosmo
+ prefix: mesh
+ denom: stake
+ coins: 100000000000000stake
hdPath: m/44'/118'/0'/0/0
coinType: 118
repo: https://github.com/osmosis/mesh-security-sdk
+ genesis:
+ app_state:
+ meshsecurity:
+ params:
+ epoch_length: 10
+ staking:
+ params:
+ unbonding_time: 200s
ports:
rest: 1313
rpc: 26653
@@ -19,21 +27,30 @@ chains:
cpu: "0.2"
memory: "200M"
faucet:
+ concurreny: 2
resources:
cpu: "0.1"
memory: "100M"
- - name: mesh-juno-1
+ - name: mesh-2
type: custom
numValidators: 1
- image: anmol1696/meshd:juno
+ image: anmol1696/meshd:latest
home: /root/.meshd
binary: meshd
- prefix: juno
- denom: ujuno
- coins: 100000000000000ujuno
+ prefix: mesh
+ denom: stake
+ coins: 100000000000000stake
hdPath: m/44'/118'/0'/0/0
coinType: 118
repo: https://github.com/osmosis/mesh-security-sdk
+ genesis:
+ app_state:
+ meshsecurity:
+ params:
+ epoch_length: 10
+ staking:
+ params:
+ unbonding_time: 200s
ports:
rest: 1317
rpc: 26657
@@ -42,18 +59,22 @@ chains:
cpu: "0.2"
memory: "200M"
faucet:
+ concurreny: 2
resources:
cpu: "0.1"
memory: "100M"
relayers:
- - name: juno-osmo
+ - name: mesh-1-mesh-2
type: hermes
replicas: 1
- image: ghcr.io/cosmology-tech/starship/hermes:39033cdee9e7aaa2274aeca3ab152542bf93d8bd
+ image: ghcr.io/cosmology-tech/starship/hermes:1.6.0
chains:
- - mesh-juno-1
- - mesh-osmosis-1
+ - mesh-1
+ - mesh-2
+ config:
+ event_source:
+ mode: pull
resources:
cpu: "0.1"
memory: "100M"
diff --git a/tests/starship/configs/devnet.yaml b/tests/starship/configs/devnet.yaml
index 35749bad..0482c3a6 100644
--- a/tests/starship/configs/devnet.yaml
+++ b/tests/starship/configs/devnet.yaml
@@ -1,16 +1,24 @@
chains:
- - name: mesh-osmosis-1
+ - name: mesh-1
type: custom
numValidators: 4
- image: anmol1696/meshd:osmo
+ image: ghcr.io/osmosis-labs/meshd:latest
home: /root/.meshd
binary: meshd
- prefix: osmo
- denom: uosmo
- coins: 100000000000000uosmo
+ prefix: mesh
+ denom: stake
+ coins: 100000000000000stake
hdPath: m/44'/118'/0'/0/0
coinType: 118
repo: https://github.com/osmosis/mesh-security-sdk
+ genesis:
+ app_state:
+ meshsecurity:
+ params:
+ epoch_lenght: 10
+ staking:
+ params:
+ unbonding_time: 200s
ports:
rest: 1313
rpc: 26653
@@ -22,18 +30,26 @@ chains:
resources:
cpu: 0.5
memory: 1Gi
- - name: mesh-juno-1
+ - name: mesh-2
type: custom
numValidators: 4
- image: anmol1696/meshd:juno
+ image: ghcr.io/osmosis-labs/meshd:latest
home: /root/.meshd
binary: meshd
- prefix: juno
- denom: ujuno
- coins: 100000000000000ujuno
+ prefix: mesh
+ denom: stake
+ coins: 100000000000000stake
hdPath: m/44'/118'/0'/0/0
coinType: 118
repo: https://github.com/osmosis/mesh-security-sdk
+ genesis:
+ app_state:
+ meshsecurity:
+ params:
+ epoch_lenght: 10
+ staking:
+ params:
+ unbonding_time: 200s
ports:
rest: 1317
rpc: 26657
@@ -47,13 +63,16 @@ chains:
memory: 1Gi
relayers:
- - name: juno-osmo
+ - name: mesh-1-mesh-2
type: hermes
replicas: 1
- image: ghcr.io/cosmology-tech/starship/hermes:39033cdee9e7aaa2274aeca3ab152542bf93d8bd
+ image: ghcr.io/cosmology-tech/starship/hermes:1.6.0
chains:
- - mesh-juno-1
- - mesh-osmosis-1
+ - mesh-1
+ - mesh-2
+ config:
+ event_source:
+ mode: pull
resources:
cpu: 1
memory: 2Gi
diff --git a/tests/starship/configs/starship.yaml b/tests/starship/configs/local.yaml
similarity index 54%
rename from tests/starship/configs/starship.yaml
rename to tests/starship/configs/local.yaml
index 4f64f91d..7d7f0035 100644
--- a/tests/starship/configs/starship.yaml
+++ b/tests/starship/configs/local.yaml
@@ -1,16 +1,24 @@
chains:
- - name: mesh-osmosis-1
+ - name: mesh-1
type: custom
numValidators: 2
- image: anmol1696/meshd:osmo
+ image: anmol1696/meshd:latest
home: /root/.meshd
binary: meshd
- prefix: osmo
- denom: uosmo
- coins: 100000000000000uosmo
+ prefix: mesh
+ denom: stake
+ coins: 100000000000000stake
hdPath: m/44'/118'/0'/0/0
coinType: 118
repo: https://github.com/osmosis/mesh-security-sdk
+ genesis:
+ app_state:
+ meshsecurity:
+ params:
+ epoch_length: 10
+ staking:
+ params:
+ unbonding_time: 200s
ports:
rest: 1313
rpc: 26653
@@ -22,18 +30,26 @@ chains:
resources:
cpu: 0.5
memory: 1Gi
- - name: mesh-juno-1
+ - name: mesh-2
type: custom
numValidators: 2
- image: anmol1696/meshd:juno
+ image: anmol1696/meshd:latest
home: /root/.meshd
binary: meshd
- prefix: juno
- denom: ujuno
- coins: 100000000000000ujuno
+ prefix: mesh
+ denom: stake
+ coins: 100000000000000stake
hdPath: m/44'/118'/0'/0/0
coinType: 118
repo: https://github.com/osmosis/mesh-security-sdk
+ genesis:
+ app_state:
+ meshsecurity:
+ params:
+ epoch_length: 10
+ staking:
+ params:
+ unbonding_time: 200s
ports:
rest: 1317
rpc: 26657
@@ -47,13 +63,16 @@ chains:
memory: 1Gi
relayers:
- - name: juno-osmo
+ - name: mesh-1-mesh-2
type: hermes
replicas: 1
- image: ghcr.io/cosmology-tech/starship/hermes:39033cdee9e7aaa2274aeca3ab152542bf93d8bd
+ image: ghcr.io/cosmology-tech/starship/hermes:1.6.0
chains:
- - mesh-juno-1
- - mesh-osmosis-1
+ - mesh-1
+ - mesh-2
+ config:
+ event_source:
+ mode: pull
resources:
cpu: 1
memory: 2Gi
diff --git a/tests/starship/go.mod b/tests/starship/go.mod
index a5c27425..7f57b9a7 100644
--- a/tests/starship/go.mod
+++ b/tests/starship/go.mod
@@ -3,7 +3,7 @@ module github.com/osmosis-labs/mesh-security-sdk/tests/starship
go 1.19
require (
- github.com/CosmWasm/wasmd v0.41.0-rc.3
+ github.com/CosmWasm/wasmd v0.41.0
github.com/CosmWasm/wasmvm v1.3.0 // indirect
github.com/cosmos/cosmos-proto v1.0.0-beta.2 // indirect
github.com/cosmos/cosmos-sdk v0.47.4
diff --git a/tests/starship/go.sum b/tests/starship/go.sum
index e105e259..5688ab04 100644
--- a/tests/starship/go.sum
+++ b/tests/starship/go.sum
@@ -213,8 +213,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg=
github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4=
-github.com/CosmWasm/wasmd v0.41.0-rc.3 h1:0NRwC4dOO56GBV42niXvYlhyeZa8d5kEVEaUp6h4axg=
-github.com/CosmWasm/wasmd v0.41.0-rc.3/go.mod h1:0Sds1q2IsPaTN1gHa3BNOYcUFgtGvxH7CXEXPgoihns=
+github.com/CosmWasm/wasmd v0.41.0 h1:fmwxSbwb50zZDcBaayYFRLIaSFca+EFld1WOaQi49jg=
+github.com/CosmWasm/wasmd v0.41.0/go.mod h1:0Sds1q2IsPaTN1gHa3BNOYcUFgtGvxH7CXEXPgoihns=
github.com/CosmWasm/wasmvm v1.3.0 h1:x12X4bKlUPS7TT9QQP45+fJo2sp30GEbiSSgb9jsec8=
github.com/CosmWasm/wasmvm v1.3.0/go.mod h1:vW/E3h8j9xBQs9bCoijDuawKo9kCtxOaS8N8J7KFtkc=
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
diff --git a/tests/starship/main_test.go b/tests/starship/main_test.go
index 107496ed..d91959a4 100644
--- a/tests/starship/main_test.go
+++ b/tests/starship/main_test.go
@@ -28,11 +28,11 @@ func AssertTotalDelegated(t *testing.T, p *setup.ConsumerClient, expTotalDelegat
Pagination: nil,
})
assert.NoError(t, err)
- if expTotalDelegated == sdk.ZeroInt() {
+ if expTotalDelegated == math.ZeroInt() {
assert.Nil(t, delegations.DelegationResponses)
return
}
- actualDelegated := sdk.NewCoin(p.Chain.Denom, sdk.ZeroInt())
+ actualDelegated := sdk.NewCoin(p.Chain.Denom, math.ZeroInt())
for _, delegation := range delegations.DelegationResponses {
actualDelegated = actualDelegated.Add(delegation.Balance)
}
@@ -54,11 +54,11 @@ func AssertShare(t *testing.T, p *setup.ConsumerClient, val string, exp math.Leg
}
func TestMain(m *testing.M) {
- flag.StringVar(&wasmContractPath, "contracts-path", "testdata", "Set path to dir with gzipped wasm contracts")
+ flag.StringVar(&wasmContractPath, "contracts-path", "../testdata", "Set path to dir with gzipped wasm contracts")
flag.BoolVar(&wasmContractGZipped, "gzipped", true, "Use `.gz` file ending when set")
- flag.StringVar(&configFile, "config", "configs/devnet.yaml", "starship config file for the infra")
- flag.StringVar(&providerChain, "provider-chain", "mesh-osmosis-1", "provider chain name, from config file")
- flag.StringVar(&consumerChain, "consumer-chain", "mesh-juno-1", "consumer chain name, from config file")
+ flag.StringVar(&configFile, "config", "configs/local.yaml", "starship config file for the infra")
+ flag.StringVar(&providerChain, "provider-chain", "mesh-1", "provider chain name, from config file")
+ flag.StringVar(&consumerChain, "consumer-chain", "mesh-2", "consumer chain name, from config file")
flag.Parse()
os.Exit(m.Run())
diff --git a/tests/starship/mvp_test.go b/tests/starship/mvp_test.go
index 706cc826..400c6845 100644
--- a/tests/starship/mvp_test.go
+++ b/tests/starship/mvp_test.go
@@ -409,5 +409,5 @@ func TestMVP(t *testing.T) {
Denom: providerClient.Chain.Denom,
})
require.NoError(t, err)
- assert.Less(t, math.NewInt(100_000), balanceAfter.Balance.Sub(*balanceBefore.Balance).Amount.Sub(math.NewInt(30_000_000)))
+ assert.Less(t, math.NewInt(100_000), balanceAfter.Balance.Sub(*balanceBefore.Balance).Amount.Sub(sdk.NewInt(30_000_000)))
}
diff --git a/tests/starship/scripts/install.sh b/tests/starship/scripts/install.sh
new file mode 100644
index 00000000..734d024e
--- /dev/null
+++ b/tests/starship/scripts/install.sh
@@ -0,0 +1,119 @@
+#!/bin/bash
+
+## Script used to install the helm chart for the devnet from a config file
+## Usage:
+## ./scripts/install.sh --coinfig
+## Options:
+## -c|--config: config file to use (default: config.yaml)
+## -v|--version: helm chart version (default: 0.1.43)
+
+set -euo pipefail
+
+# read config file from args into variable
+CONFIGFILE="config.yaml"
+
+SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
+echo "Script dir: ${SCRIPT_DIR}"
+
+# default values
+DRY_RUN=""
+TIMEOUT=""
+NAMESPACE=""
+HELM_REPO="starship"
+HELM_CHART="starship/devnet"
+HELM_REPO_URL="https://cosmology-tech.github.io/starship/"
+HELM_CHART_VERSION="0.1.43"
+
+# check_helm function verifies the helm binary is installed
+function check_helm() {
+ if ! command -v helm &> /dev/null
+ then
+ echo "helm could not be found; please install it first!!!"
+ exit
+ fi
+}
+
+# setup_helm function adds the helm repo and updates it
+function setup_helm() {
+ helm repo add ${HELM_REPO} ${HELM_REPO_URL}
+ helm repo update
+ helm search repo ${HELM_CHART} --version ${HELM_CHART_VERSION}
+}
+
+function set_helm_args() {
+ if [[ $TIMEOUT ]]; then
+ args="$args --timeout $TIMEOUT --wait --debug"
+ fi
+ if [[ $NAMESPACE ]]; then
+ args="$args --namespace $NAMESPACE --create-namespace"
+ fi
+ if [[ "$DRY_RUN" == 0 ]]; then
+ args="$args --dry-run --debug"
+ fi
+ num_chains=$(yq -r ".chains | length - 1" ${CONFIGFILE})
+ if [[ $num_chains -lt 0 ]]; then
+ echo "No chains to parse: num: $num_chains"
+ return 0
+ fi
+ for i in $(seq 0 $num_chains); do
+ chain=$(yq -r ".chains[$i].name" ${CONFIGFILE})
+ scripts=$(yq -r ".chains[$i].scripts" ${CONFIGFILE})
+ if [[ "$scripts" == "null" ]]; then
+ return 0
+ fi
+ datadir="$(cd "$(dirname -- "${CONFIGFILE}")" >/dev/null; pwd -P)"
+ for script in $(yq -r ".chains[$i].scripts | keys | .[]" ${CONFIGFILE}); do
+ args="$args --set-file chains[$i].scripts.$script.data=$datadir/$(yq -r ".chains[$i].scripts.$script.file" ${CONFIGFILE})"
+ done
+ done
+}
+
+function install_chart() {
+ args=""
+ set_helm_args
+ echo "name: ${HELM_NAME}, args: $args, chart: ${HELM_CHART}, version: ${HELM_CHART_VERSION}"
+ helm install ${HELM_NAME} ${HELM_CHART} --version ${HELM_CHART_VERSION} -f ${CONFIGFILE} $args
+}
+
+while [ $# -gt 0 ]; do
+ case "$1" in
+ -c|--config)
+ CONFIGFILE="$2"
+ shift 2 # past argument=value
+ ;;
+ -v|--version)
+ HELM_CHART_VERSION="$2"
+ shift 2 # past argument
+ ;;
+ -t|--timeout)
+ TIMEOUT="$2"
+ shift 2 # past argument
+ ;;
+ -n|--name)
+ HELM_NAME="$2"
+ shift 2 # past argument
+ ;;
+ --namespace)
+ NAMESPACE="$2"
+ shift 2 # past argument
+ ;;
+ --chart)
+ HELM_CHART="$2"
+ shift 2 # past argument
+ ;;
+ --dry-run)
+ DRY_RUN=1
+ shift # past argument
+ ;;
+ -*|--*)
+ echo "Unknown option $1"
+ exit 1
+ ;;
+ *)
+ ;;
+ esac
+done
+
+check_helm
+setup_helm
+install_chart
diff --git a/tests/starship/scripts/port-forward.sh b/tests/starship/scripts/port-forward.sh
index 1dc1eafb..ab6a1144 100755
--- a/tests/starship/scripts/port-forward.sh
+++ b/tests/starship/scripts/port-forward.sh
@@ -21,6 +21,7 @@ function stop_port_forward() {
# Default values
CHAIN_RPC_PORT=26657
+CHAIN_GRPC_PORT=9090
CHAIN_LCD_PORT=1317
CHAIN_EXPOSER_PORT=8081
CHAIN_FAUCET_PORT=8000
@@ -55,15 +56,17 @@ fi
for i in $(seq 0 $num_chains); do
chain=$(yq -r ".chains[$i].name" ${CONFIGFILE} )
localrpc=$(yq -r ".chains[$i].ports.rpc" ${CONFIGFILE} )
+ localgrpc=$(yq -r ".chains[$i].ports.grpc" ${CONFIGFILE} )
locallcd=$(yq -r ".chains[$i].ports.rest" ${CONFIGFILE} )
localexp=$(yq -r ".chains[$i].ports.exposer" ${CONFIGFILE})
localfaucet=$(yq -r ".chains[$i].ports.faucet" ${CONFIGFILE})
- [[ "$localrpc" != "null" ]] && kubectl port-forward pods/$chain-genesis-0 $localrpc:$CHAIN_RPC_PORT > /dev/null 2>&1 &
- [[ "$locallcd" != "null" ]] && kubectl port-forward pods/$chain-genesis-0 $locallcd:$CHAIN_LCD_PORT > /dev/null 2>&1 &
- [[ "$localexp" != "null" ]] && kubectl port-forward pods/$chain-genesis-0 $localexp:$CHAIN_EXPOSER_PORT > /dev/null 2>&1 &
- [[ "$localfaucet" != "null" ]] && kubectl port-forward pods/$chain-genesis-0 $localfaucet:$CHAIN_FAUCET_PORT > /dev/null 2>&1 &
+ color yellow "chains: forwarded $chain"
+ [[ "$localrpc" != "null" ]] && color yellow " rpc to http://localhost:$localrpc" && kubectl port-forward pods/$chain-genesis-0 $localrpc:$CHAIN_RPC_PORT > /dev/null 2>&1 &
+ [[ "$localgrpc" != "null" ]] && color yellow " grpc to http://localhost:$localgrpc" && kubectl port-forward pods/$chain-genesis-0 $localgrpc:$CHAIN_GRPC_PORT > /dev/null 2>&1 &
+ [[ "$locallcd" != "null" ]] && color yellow " lcd to http://localhost:$locallcd" && kubectl port-forward pods/$chain-genesis-0 $locallcd:$CHAIN_LCD_PORT > /dev/null 2>&1 &
+ [[ "$localexp" != "null" ]] && color yellow " exposer to http://localhost:$localexp" && kubectl port-forward pods/$chain-genesis-0 $localexp:$CHAIN_EXPOSER_PORT > /dev/null 2>&1 &
+ [[ "$localfaucet" != "null" ]] && color yellow " faucet to http://localhost:$localfaucet" && kubectl port-forward pods/$chain-genesis-0 $localfaucet:$CHAIN_FAUCET_PORT > /dev/null 2>&1 &
sleep 1
- color yellow "chains: forwarded $chain lcd to http://localhost:$locallcd, rpc to http://localhost:$localrpc, faucet to http://localhost:$localfaucet"
done
echo "Port forward services"
diff --git a/tests/starship/setup/contract.go b/tests/starship/setup/contract.go
index 0413d383..c073a30f 100644
--- a/tests/starship/setup/contract.go
+++ b/tests/starship/setup/contract.go
@@ -4,6 +4,7 @@ import (
"bytes"
"compress/gzip"
"context"
+ "cosmossdk.io/math"
"encoding/json"
"fmt"
"os"
@@ -28,7 +29,7 @@ func buildPathToWasm(wasmContractPath string, fileName string, wasmContractGZipp
func submitGovProposal(chain *Client, msgs ...sdk.Msg) (uint64, error) {
// fetch gov params from the local
- initialDeposit := sdk.NewCoins(sdk.NewCoin(chain.Denom, sdk.NewInt(10000000)))
+ initialDeposit := sdk.NewCoins(sdk.NewCoin(chain.Denom, math.NewInt(10000000)))
govMsg, err := govv1.NewMsgSubmitProposal(msgs, initialDeposit, chain.Address, "", "my title", "my summary")
if err != nil {
return 0, err
@@ -98,7 +99,7 @@ func voteAndPassGovProposal(chain *Client, proposalID uint64) error {
if proposal.Proposal.Status == govv1.ProposalStatus_PROPOSAL_STATUS_PASSED {
return nil
}
- return fmt.Errorf("proposal failed: id: %s, status: %d\n", proposal.Proposal.Id, proposal.Proposal.Status)
+ return fmt.Errorf("proposal failed: id: %d, status: %d\n", proposal.Proposal.Id, proposal.Proposal.Status)
}
func InstantiateContract(chain *Client, codeID uint64, label string, initMsg []byte, funds ...sdk.Coin) (map[uint64]string, error) {
@@ -115,7 +116,7 @@ func InstantiateContract(chain *Client, codeID uint64, label string, initMsg []b
if err != nil {
return nil, err
}
- fmt.Printf("response for instantiate contract: %s\n", r.Code)
+ fmt.Printf("response for instantiate contract: %d\n", r.Code)
// map of codeid and contract address
addrs := map[uint64]string{}
diff --git a/tests/starship/setup/utils.go b/tests/starship/setup/utils.go
index 1873a5f5..33cd9e8e 100644
--- a/tests/starship/setup/utils.go
+++ b/tests/starship/setup/utils.go
@@ -2,6 +2,7 @@ package setup
import (
"context"
+ "cosmossdk.io/math"
"fmt"
sdk "github.com/cosmos/cosmos-sdk/types"
bankTypes "github.com/cosmos/cosmos-sdk/x/bank/types"
@@ -21,7 +22,7 @@ func IBCTransferTokens(chain1, chain2 *Client, chain2Addr string, amount int) er
return err
}
- coin := sdk.Coin{Denom: denom, Amount: sdk.NewInt(int64(amount))}
+ coin := sdk.Coin{Denom: denom, Amount: math.NewInt(int64(amount))}
req := &transfertypes.MsgTransfer{
SourcePort: channel.Chain_2.PortId,
SourceChannel: channel.Chain_2.ChannelId,
diff --git a/x/meshsecurity/keeper/genesis.go b/x/meshsecurity/keeper/genesis.go
new file mode 100644
index 00000000..e669d0c3
--- /dev/null
+++ b/x/meshsecurity/keeper/genesis.go
@@ -0,0 +1,18 @@
+package keeper
+
+import (
+ sdk "github.com/cosmos/cosmos-sdk/types"
+
+ "github.com/osmosis-labs/mesh-security-sdk/x/meshsecurity/types"
+)
+
+func (k Keeper) InitGenesis(ctx sdk.Context, data types.GenesisState) {
+ if err := k.SetParams(ctx, data.Params); err != nil {
+ panic(err)
+ }
+}
+
+func (k Keeper) ExportGenesis(ctx sdk.Context) *types.GenesisState {
+ params := k.GetParams(ctx)
+ return types.NewGenesisState(params)
+}
diff --git a/x/meshsecurity/keeper/genesis_test.go b/x/meshsecurity/keeper/genesis_test.go
new file mode 100644
index 00000000..1b4b5792
--- /dev/null
+++ b/x/meshsecurity/keeper/genesis_test.go
@@ -0,0 +1,67 @@
+package keeper
+
+import (
+ "cosmossdk.io/math"
+ sdk "github.com/cosmos/cosmos-sdk/types"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+ "testing"
+
+ "github.com/osmosis-labs/mesh-security-sdk/x/meshsecurity/types"
+)
+
+func TestInitGenesis(t *testing.T) {
+ specs := map[string]struct {
+ state types.GenesisState
+ expErr bool
+ }{
+ "custom param, should pass": {
+ state: types.GenesisState{
+ Params: types.Params{
+ TotalContractsMaxCap: sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(15_000_000_000)),
+ EpochLength: 2_000,
+ MaxGasEndBlocker: 600_000,
+ },
+ },
+ expErr: false,
+ },
+ "custom small value param, should pass": {
+ state: types.GenesisState{
+ Params: types.Params{
+ TotalContractsMaxCap: sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(1_000_000)),
+ EpochLength: 20,
+ MaxGasEndBlocker: 10_000,
+ },
+ },
+ expErr: false,
+ },
+ }
+
+ for name, spec := range specs {
+ t.Run(name, func(t *testing.T) {
+ pCtx, keepers := CreateDefaultTestInput(t)
+ k := keepers.MeshKeeper
+
+ k.InitGenesis(pCtx, spec.state)
+
+ p := k.GetParams(pCtx)
+ assert.Equal(t, spec.state.Params.MaxGasEndBlocker, p.MaxGasEndBlocker)
+ assert.Equal(t, spec.state.Params.EpochLength, p.EpochLength)
+ assert.Equal(t, spec.state.Params.TotalContractsMaxCap, p.TotalContractsMaxCap)
+ })
+ }
+}
+
+func TestExportGenesis(t *testing.T) {
+ pCtx, keepers := CreateDefaultTestInput(t)
+ k := keepers.MeshKeeper
+ params := types.DefaultParams(sdk.DefaultBondDenom)
+
+ err := k.SetParams(pCtx, params)
+ require.NoError(t, err)
+
+ exported := k.ExportGenesis(pCtx)
+ assert.Equal(t, params.MaxGasEndBlocker, exported.Params.MaxGasEndBlocker)
+ assert.Equal(t, params.EpochLength, exported.Params.EpochLength)
+ assert.Equal(t, params.TotalContractsMaxCap, exported.Params.TotalContractsMaxCap)
+}
diff --git a/x/meshsecurity/module.go b/x/meshsecurity/module.go
index 7732b2d8..c717c5d6 100644
--- a/x/meshsecurity/module.go
+++ b/x/meshsecurity/module.go
@@ -3,6 +3,7 @@ package meshsecurity
import (
"context"
"encoding/json"
+ "fmt"
abci "github.com/cometbft/cometbft/abci/types"
@@ -49,12 +50,17 @@ func (AppModuleBasic) Name() string {
// DefaultGenesis returns default genesis state as raw bytes for the mesh-security
// module.
func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage {
- return nil
+ return cdc.MustMarshalJSON(types.DefaultGenesisState(sdk.DefaultBondDenom))
}
// ValidateGenesis performs genesis state validation for the mesh-security module.
-func (b AppModuleBasic) ValidateGenesis(marshaler codec.JSONCodec, _ client.TxEncodingConfig, message json.RawMessage) error {
- return nil
+func (b AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, _ client.TxEncodingConfig, bz json.RawMessage) error {
+ var data types.GenesisState
+ if err := cdc.UnmarshalJSON(bz, &data); err != nil {
+ return fmt.Errorf("failed to unmarshal %s genesis state: %w", types.ModuleName, err)
+ }
+
+ return types.ValidateGenesis(&data)
}
// GetTxCmd returns the root tx command for the mesh-security module.
@@ -111,6 +117,20 @@ func (am AppModule) RegisterServices(cfg module.Configurator) {
func (am AppModule) RegisterInvariants(ir sdk.InvariantRegistry) {
}
+// InitGenesis performs genesis initialization for the mesh-security module. It returns
+// no validator updates.
+func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, bz json.RawMessage) []abci.ValidatorUpdate {
+ var data types.GenesisState
+ cdc.MustUnmarshalJSON(bz, &data)
+ am.k.InitGenesis(ctx, data)
+ return []abci.ValidatorUpdate{}
+}
+
+// ExportGenesis returns the exported genesis state as raw bytes for the mesh-security
+func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.RawMessage {
+ return cdc.MustMarshalJSON(am.k.ExportGenesis(ctx))
+}
+
// QuerierRoute returns the bank module's querier route name.
func (AppModule) QuerierRoute() string {
return types.RouterKey
diff --git a/x/meshsecurity/types/genesis.go b/x/meshsecurity/types/genesis.go
new file mode 100644
index 00000000..76545112
--- /dev/null
+++ b/x/meshsecurity/types/genesis.go
@@ -0,0 +1,15 @@
+package types
+
+func NewGenesisState(params Params) *GenesisState {
+ return &GenesisState{
+ Params: params,
+ }
+}
+
+func DefaultGenesisState(denom string) *GenesisState {
+ return NewGenesisState(DefaultParams(denom))
+}
+
+func ValidateGenesis(gs *GenesisState) error {
+ return gs.Params.ValidateBasic()
+}
diff --git a/x/meshsecurity/types/genesis.pb.go b/x/meshsecurity/types/genesis.pb.go
new file mode 100644
index 00000000..5575e806
--- /dev/null
+++ b/x/meshsecurity/types/genesis.pb.go
@@ -0,0 +1,357 @@
+// Code generated by protoc-gen-gogo. DO NOT EDIT.
+// source: osmosis/meshsecurity/v1beta1/genesis.proto
+
+package types
+
+import (
+ fmt "fmt"
+ io "io"
+ math "math"
+ math_bits "math/bits"
+
+ _ "github.com/cosmos/cosmos-sdk/types/tx/amino"
+ _ "github.com/cosmos/gogoproto/gogoproto"
+ proto "github.com/cosmos/gogoproto/proto"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+ _ = proto.Marshal
+ _ = fmt.Errorf
+ _ = math.Inf
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
+
+// GenesisState defines meshsecurity module's genesis state.
+type GenesisState struct {
+ Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"`
+}
+
+func (m *GenesisState) Reset() { *m = GenesisState{} }
+func (m *GenesisState) String() string { return proto.CompactTextString(m) }
+func (*GenesisState) ProtoMessage() {}
+func (*GenesisState) Descriptor() ([]byte, []int) {
+ return fileDescriptor_e38a457d5139d73a, []int{0}
+}
+
+func (m *GenesisState) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+
+func (m *GenesisState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ if deterministic {
+ return xxx_messageInfo_GenesisState.Marshal(b, m, deterministic)
+ } else {
+ b = b[:cap(b)]
+ n, err := m.MarshalToSizedBuffer(b)
+ if err != nil {
+ return nil, err
+ }
+ return b[:n], nil
+ }
+}
+
+func (m *GenesisState) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_GenesisState.Merge(m, src)
+}
+
+func (m *GenesisState) XXX_Size() int {
+ return m.Size()
+}
+
+func (m *GenesisState) XXX_DiscardUnknown() {
+ xxx_messageInfo_GenesisState.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GenesisState proto.InternalMessageInfo
+
+func init() {
+ proto.RegisterType((*GenesisState)(nil), "osmosis.meshsecurity.v1beta1.GenesisState")
+}
+
+func init() {
+ proto.RegisterFile("osmosis/meshsecurity/v1beta1/genesis.proto", fileDescriptor_e38a457d5139d73a)
+}
+
+var fileDescriptor_e38a457d5139d73a = []byte{
+ // 247 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0xca, 0x2f, 0xce, 0xcd,
+ 0x2f, 0xce, 0x2c, 0xd6, 0xcf, 0x4d, 0x2d, 0xce, 0x28, 0x4e, 0x4d, 0x2e, 0x2d, 0xca, 0x2c, 0xa9,
+ 0xd4, 0x2f, 0x33, 0x4c, 0x4a, 0x2d, 0x49, 0x34, 0xd4, 0x4f, 0x4f, 0xcd, 0x4b, 0x2d, 0xce, 0x2c,
+ 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x81, 0xaa, 0xd5, 0x43, 0x56, 0xab, 0x07, 0x55,
+ 0x2b, 0xa5, 0x8f, 0xd7, 0x24, 0x14, 0x2d, 0x60, 0xe3, 0xa4, 0x44, 0xd2, 0xf3, 0xd3, 0xf3, 0xc1,
+ 0x4c, 0x7d, 0x10, 0x0b, 0x2a, 0x2a, 0x98, 0x98, 0x9b, 0x99, 0x97, 0xaf, 0x0f, 0x26, 0x21, 0x42,
+ 0x4a, 0xb1, 0x5c, 0x3c, 0xee, 0x10, 0x87, 0x04, 0x97, 0x24, 0x96, 0xa4, 0x0a, 0xb9, 0x73, 0xb1,
+ 0x15, 0x24, 0x16, 0x25, 0xe6, 0x16, 0x4b, 0x30, 0x2a, 0x30, 0x6a, 0x70, 0x1b, 0xa9, 0xe8, 0xe1,
+ 0x73, 0x98, 0x5e, 0x00, 0x58, 0xad, 0x13, 0xe7, 0x89, 0x7b, 0xf2, 0x0c, 0x2b, 0x9e, 0x6f, 0xd0,
+ 0x62, 0x0c, 0x82, 0x6a, 0xb7, 0x62, 0x79, 0xb1, 0x40, 0x9e, 0xd1, 0x29, 0xe1, 0xc4, 0x43, 0x39,
+ 0x86, 0x15, 0x8f, 0xe4, 0x18, 0x4e, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23,
+ 0x39, 0xc6, 0x09, 0x8f, 0xe5, 0x18, 0x2e, 0x3c, 0x96, 0x63, 0xb8, 0xf1, 0x58, 0x8e, 0x21, 0xca,
+ 0x2e, 0x3d, 0xb3, 0x24, 0xa3, 0x34, 0x49, 0x2f, 0x39, 0x3f, 0x17, 0xe6, 0x4b, 0xdd, 0x9c, 0xc4,
+ 0x24, 0x88, 0x57, 0x75, 0x61, 0x16, 0xea, 0x16, 0xa7, 0x64, 0xeb, 0x57, 0xa0, 0x7a, 0xbf, 0xa4,
+ 0xb2, 0x20, 0xb5, 0x38, 0x89, 0x0d, 0xec, 0x0f, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x75,
+ 0x0f, 0xd3, 0x37, 0x6d, 0x01, 0x00, 0x00,
+}
+
+func (this *GenesisState) Equal(that interface{}) bool {
+ if that == nil {
+ return this == nil
+ }
+
+ that1, ok := that.(*GenesisState)
+ if !ok {
+ that2, ok := that.(GenesisState)
+ if ok {
+ that1 = &that2
+ } else {
+ return false
+ }
+ }
+ if that1 == nil {
+ return this == nil
+ } else if this == nil {
+ return false
+ }
+ if !this.Params.Equal(&that1.Params) {
+ return false
+ }
+ return true
+}
+
+func (m *GenesisState) Marshal() (dAtA []byte, err error) {
+ size := m.Size()
+ dAtA = make([]byte, size)
+ n, err := m.MarshalToSizedBuffer(dAtA[:size])
+ if err != nil {
+ return nil, err
+ }
+ return dAtA[:n], nil
+}
+
+func (m *GenesisState) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ {
+ size, err := m.Params.MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintGenesis(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0xa
+ return len(dAtA) - i, nil
+}
+
+func encodeVarintGenesis(dAtA []byte, offset int, v uint64) int {
+ offset -= sovGenesis(v)
+ base := offset
+ for v >= 1<<7 {
+ dAtA[offset] = uint8(v&0x7f | 0x80)
+ v >>= 7
+ offset++
+ }
+ dAtA[offset] = uint8(v)
+ return base
+}
+
+func (m *GenesisState) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ l = m.Params.Size()
+ n += 1 + l + sovGenesis(uint64(l))
+ return n
+}
+
+func sovGenesis(x uint64) (n int) {
+ return (math_bits.Len64(x|1) + 6) / 7
+}
+
+func sozGenesis(x uint64) (n int) {
+ return sovGenesis(uint64((x << 1) ^ uint64((int64(x) >> 63))))
+}
+
+func (m *GenesisState) Unmarshal(dAtA []byte) error {
+ l := len(dAtA)
+ iNdEx := 0
+ for iNdEx < l {
+ preIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowGenesis
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ wireType := int(wire & 0x7)
+ if wireType == 4 {
+ return fmt.Errorf("proto: GenesisState: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: GenesisState: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowGenesis
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthGenesis
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthGenesis
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipGenesis(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthGenesis
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+
+func skipGenesis(dAtA []byte) (n int, err error) {
+ l := len(dAtA)
+ iNdEx := 0
+ depth := 0
+ for iNdEx < l {
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return 0, ErrIntOverflowGenesis
+ }
+ if iNdEx >= l {
+ return 0, io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= (uint64(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ wireType := int(wire & 0x7)
+ switch wireType {
+ case 0:
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return 0, ErrIntOverflowGenesis
+ }
+ if iNdEx >= l {
+ return 0, io.ErrUnexpectedEOF
+ }
+ iNdEx++
+ if dAtA[iNdEx-1] < 0x80 {
+ break
+ }
+ }
+ case 1:
+ iNdEx += 8
+ case 2:
+ var length int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return 0, ErrIntOverflowGenesis
+ }
+ if iNdEx >= l {
+ return 0, io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ length |= (int(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if length < 0 {
+ return 0, ErrInvalidLengthGenesis
+ }
+ iNdEx += length
+ case 3:
+ depth++
+ case 4:
+ if depth == 0 {
+ return 0, ErrUnexpectedEndOfGroupGenesis
+ }
+ depth--
+ case 5:
+ iNdEx += 4
+ default:
+ return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
+ }
+ if iNdEx < 0 {
+ return 0, ErrInvalidLengthGenesis
+ }
+ if depth == 0 {
+ return iNdEx, nil
+ }
+ }
+ return 0, io.ErrUnexpectedEOF
+}
+
+var (
+ ErrInvalidLengthGenesis = fmt.Errorf("proto: negative length found during unmarshaling")
+ ErrIntOverflowGenesis = fmt.Errorf("proto: integer overflow")
+ ErrUnexpectedEndOfGroupGenesis = fmt.Errorf("proto: unexpected end of group")
+)
diff --git a/x/meshsecurity/types/genesis_test.go b/x/meshsecurity/types/genesis_test.go
new file mode 100644
index 00000000..6f2c3b00
--- /dev/null
+++ b/x/meshsecurity/types/genesis_test.go
@@ -0,0 +1,90 @@
+package types
+
+import (
+ "cosmossdk.io/math"
+ sdk "github.com/cosmos/cosmos-sdk/types"
+ "github.com/stretchr/testify/assert"
+ "testing"
+)
+
+func TestValidateGenesis(t *testing.T) {
+ specs := map[string]struct {
+ state GenesisState
+ expErr bool
+ }{
+ "default params": {
+ state: *DefaultGenesisState(sdk.DefaultBondDenom),
+ expErr: false,
+ },
+ "custom param, should pass": {
+ state: GenesisState{
+ Params: Params{
+ TotalContractsMaxCap: sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(15_000_000_000)),
+ EpochLength: 2_000,
+ MaxGasEndBlocker: 600_000,
+ },
+ },
+ expErr: false,
+ },
+ "custom small value param, should pass": {
+ state: GenesisState{
+ Params: Params{
+ TotalContractsMaxCap: sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(1_000_000)),
+ EpochLength: 20,
+ MaxGasEndBlocker: 10_000,
+ },
+ },
+ expErr: false,
+ },
+ "invalid epoch length, should fail": {
+ state: GenesisState{
+ Params: Params{
+ TotalContractsMaxCap: sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(15_000_000_000)),
+ EpochLength: 0,
+ MaxGasEndBlocker: 600_000,
+ },
+ },
+ expErr: true,
+ },
+ "invalid max gas length, should fail": {
+ state: GenesisState{
+ Params: Params{
+ TotalContractsMaxCap: sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(15_000_000_000)),
+ EpochLength: 10,
+ MaxGasEndBlocker: 0,
+ },
+ },
+ expErr: true,
+ },
+ "invalid max cap coin denom, should fail": {
+ state: GenesisState{
+ Params: Params{
+ TotalContractsMaxCap: sdk.Coin{Denom: "invalid denom test", Amount: math.Int{}},
+ EpochLength: 10,
+ MaxGasEndBlocker: 0,
+ },
+ },
+ expErr: true,
+ },
+ "invalid max cap coin amount, should fail": {
+ state: GenesisState{
+ Params: Params{
+ TotalContractsMaxCap: sdk.Coin{Denom: sdk.DefaultBondDenom, Amount: math.NewInt(-100)},
+ EpochLength: 10,
+ MaxGasEndBlocker: 0,
+ },
+ },
+ expErr: true,
+ },
+ }
+ for name, spec := range specs {
+ t.Run(name, func(t *testing.T) {
+ err := ValidateGenesis(&spec.state)
+ if spec.expErr {
+ assert.Error(t, err)
+ } else {
+ assert.NoError(t, err)
+ }
+ })
+ }
+}