From b13c735dd5bad9e9ca8c2e3b9e0737f143c3857d Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Tue, 25 Apr 2023 16:28:00 +0200
Subject: [PATCH 01/35] Add other steps to read/write test
---
tests/e2e/trace_handlers_test.go | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/tests/e2e/trace_handlers_test.go b/tests/e2e/trace_handlers_test.go
index 8e7fb1a653..f12ad6cdec 100644
--- a/tests/e2e/trace_handlers_test.go
+++ b/tests/e2e/trace_handlers_test.go
@@ -18,6 +18,10 @@ func TestWriterThenParser(t *testing.T) {
trace []Step
}{
"start_provider_chain": {stepStartProviderChain()},
+ "happyPath": {happyPathSteps},
+ "democracy": {democracySteps},
+ "slashThrottleSteps": {slashThrottleSteps},
+ "multipleConsumers": {multipleConsumers},
}
dir, err := os.MkdirTemp("", "example")
From f5c95154c6149f6da3ef59a3332ee831bab37638 Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Tue, 25 Apr 2023 16:30:03 +0200
Subject: [PATCH 02/35] Improve error logging in trace handler test
---
tests/e2e/trace_handlers_test.go | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/tests/e2e/trace_handlers_test.go b/tests/e2e/trace_handlers_test.go
index f12ad6cdec..5a6b45e033 100644
--- a/tests/e2e/trace_handlers_test.go
+++ b/tests/e2e/trace_handlers_test.go
@@ -38,7 +38,11 @@ func TestWriterThenParser(t *testing.T) {
t.Fatalf("error writing trace to file: %v", err)
}
- got, _ := parser.ReadTraceFromFile(filename)
+ got, err := parser.ReadTraceFromFile(filename)
+ if err != nil {
+ t.Fatalf("error reading trace from file: %v", err)
+ }
+
diff := cmp.Diff(tc.trace, got, cmp.AllowUnexported(Step{}))
if diff != "" {
t.Fatalf(diff)
From a6113ec83dadcf9774bfab6e539cb39c469ba6d2 Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Wed, 26 Apr 2023 10:18:21 +0200
Subject: [PATCH 03/35] Push ActionType handling into Unmarshal/Marshal and out
of own class
---
tests/e2e/trace_parser.go | 20 ++------------------
tests/e2e/trace_utils.go | 40 +++++++++++++++++++++++++++++++++++----
tests/e2e/trace_writer.go | 8 +-------
3 files changed, 39 insertions(+), 29 deletions(-)
diff --git a/tests/e2e/trace_parser.go b/tests/e2e/trace_parser.go
index c158b33554..b4ca98717a 100644
--- a/tests/e2e/trace_parser.go
+++ b/tests/e2e/trace_parser.go
@@ -2,7 +2,6 @@ package main
import (
"encoding/json"
- "fmt"
"os"
)
@@ -22,26 +21,11 @@ func (parser JSONParser) ReadTraceFromFile(filepath string) ([]Step, error) {
}
// Unmarshal the JSON into a slice of Step structs
- var stepsWithActionTypes []StepWithActionType
- err = json.Unmarshal(jsonData, &stepsWithActionTypes)
+ var steps []Step
+ err = json.Unmarshal(jsonData, &steps)
if err != nil {
return nil, err
}
- steps := make([]Step, len(stepsWithActionTypes))
-
- // Unmarshal the actions inside the steps from map[string]any to the corresponding action type
- for i, step := range stepsWithActionTypes {
- action, err := UnmarshalMapToActionType(step.Action.(map[string]any), step.ActionType)
- if err != nil {
- return nil, err
- }
-
- fmt.Println(action)
-
- steps[i] = Step{action, step.State}
-
- }
-
return steps, nil
}
diff --git a/tests/e2e/trace_utils.go b/tests/e2e/trace_utils.go
index 010818b217..e36a8b56f2 100644
--- a/tests/e2e/trace_utils.go
+++ b/tests/e2e/trace_utils.go
@@ -1,15 +1,47 @@
package main
import (
+ "encoding/json"
"fmt"
+ "reflect"
"github.com/mitchellh/mapstructure"
)
-// StepWithActionType is a utility class that wraps a Step together with its action type. Used to marshal/unmarshal
-type StepWithActionType struct {
- Step
- ActionType string `json:"ActionType"`
+func (step Step) MarshalJSON() ([]byte, error) {
+ actionType := reflect.TypeOf(step.Action).String()
+
+ result := struct {
+ ActionType string
+ Action interface{}
+ State State
+ }{
+ ActionType: actionType,
+ Action: step.Action,
+ State: step.State,
+ }
+
+ return json.Marshal(result)
+}
+
+func (step *Step) UnmarshalJSON(data []byte) error {
+ var tmp struct {
+ ActionType string
+ Action map[string]any
+ State State
+ }
+ if err := json.Unmarshal(data, &tmp); err != nil {
+ return err
+ }
+
+ action, err := UnmarshalMapToActionType(tmp.Action, tmp.ActionType)
+ if err != nil {
+ return err
+ }
+
+ step.Action = action
+ step.State = tmp.State
+ return nil
}
// UnmarshalMapToActionType takes a JSON object and an action type and marshals into an object of the corresponding action.
diff --git a/tests/e2e/trace_writer.go b/tests/e2e/trace_writer.go
index 73fd703701..e559c7a1ff 100644
--- a/tests/e2e/trace_writer.go
+++ b/tests/e2e/trace_writer.go
@@ -3,7 +3,6 @@ package main
import (
"encoding/json"
"os"
- "reflect"
)
// TraceWriter is an interface for writers that write steps to files.
@@ -16,12 +15,7 @@ type TraceWriter interface {
type JSONWriter struct{}
func (writer JSONWriter) WriteTraceToFile(filepath string, trace []Step) error {
- traceWithMarshalledActions := make([]StepWithActionType, 0)
- for _, step := range trace {
- actionType := reflect.TypeOf(step.Action).String()
- traceWithMarshalledActions = append(traceWithMarshalledActions, StepWithActionType{step, actionType})
- }
- jsonobj, err := json.Marshal(traceWithMarshalledActions)
+ jsonobj, err := json.Marshal(trace)
if err != nil {
return err
}
From aafcb0541af1f780474fe65ecf6ec0ffded1e0c4 Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Wed, 26 Apr 2023 10:24:16 +0200
Subject: [PATCH 04/35] Rename generic trace handler files to be clear they are
for json
---
tests/e2e/{trace_parser.go => json_parser.go} | 0
tests/e2e/{trace_utils.go => json_step_marshaller.go} | 0
tests/e2e/{trace_writer.go => json_writer.go} | 0
3 files changed, 0 insertions(+), 0 deletions(-)
rename tests/e2e/{trace_parser.go => json_parser.go} (100%)
rename tests/e2e/{trace_utils.go => json_step_marshaller.go} (100%)
rename tests/e2e/{trace_writer.go => json_writer.go} (100%)
diff --git a/tests/e2e/trace_parser.go b/tests/e2e/json_parser.go
similarity index 100%
rename from tests/e2e/trace_parser.go
rename to tests/e2e/json_parser.go
diff --git a/tests/e2e/trace_utils.go b/tests/e2e/json_step_marshaller.go
similarity index 100%
rename from tests/e2e/trace_utils.go
rename to tests/e2e/json_step_marshaller.go
diff --git a/tests/e2e/trace_writer.go b/tests/e2e/json_writer.go
similarity index 100%
rename from tests/e2e/trace_writer.go
rename to tests/e2e/json_writer.go
From 1a650a6969e793b8c3025878e7654158e85eb7b9 Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Wed, 26 Apr 2023 10:25:08 +0200
Subject: [PATCH 05/35] Rename to marshalling to be more generic
---
tests/e2e/{json_step_marshaller.go => json_step_marshalling.go} | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename tests/e2e/{json_step_marshaller.go => json_step_marshalling.go} (100%)
diff --git a/tests/e2e/json_step_marshaller.go b/tests/e2e/json_step_marshalling.go
similarity index 100%
rename from tests/e2e/json_step_marshaller.go
rename to tests/e2e/json_step_marshalling.go
From d3ea342c86dc33d4b417912e5e8038f866cbd35a Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Wed, 26 Apr 2023 12:40:43 +0200
Subject: [PATCH 06/35] Add marshal/unmarshal for proposals
---
tests/e2e/json_chainState_marshalling.go | 158 +++++++++++++++++++++++
tests/e2e/json_step_marshalling.go | 2 +
2 files changed, 160 insertions(+)
create mode 100644 tests/e2e/json_chainState_marshalling.go
diff --git a/tests/e2e/json_chainState_marshalling.go b/tests/e2e/json_chainState_marshalling.go
new file mode 100644
index 0000000000..1d32282e14
--- /dev/null
+++ b/tests/e2e/json_chainState_marshalling.go
@@ -0,0 +1,158 @@
+package main
+
+import (
+ "encoding/json"
+ "fmt"
+ "reflect"
+
+ "github.com/mitchellh/mapstructure"
+)
+
+type ProposalWithType struct {
+ ProposalType string
+ Proposal Proposal
+}
+
+// MarshalJSON marshals a chainState into JSON while including the type of the proposal.
+func (chainState ChainState) MarshalJSON() ([]byte, error) {
+ var proposalsWithTypes map[uint]ProposalWithType
+ if chainState.Proposals != nil {
+ proposalsWithTypes = make(map[uint]ProposalWithType, len(*chainState.Proposals))
+
+ for k, v := range *chainState.Proposals {
+ proposalsWithTypes[k] = ProposalWithType{
+ ProposalType: reflect.TypeOf(v).String(),
+ Proposal: v,
+ }
+ }
+ } else {
+ proposalsWithTypes = make(map[uint]ProposalWithType, 0)
+ }
+
+ result := struct {
+ ValBalances *map[ValidatorID]uint
+ Proposals *map[uint]ProposalWithType
+ ValPowers *map[ValidatorID]uint
+ RepresentativePowers *map[ValidatorID]uint
+ Params *[]Param
+ Rewards *Rewards
+ ConsumerChains *map[ChainID]bool
+ AssignedKeys *map[ValidatorID]string
+ ProviderKeys *map[ValidatorID]string // validatorID: validator provider key
+ ConsumerChainQueueSizes *map[ChainID]uint
+ GlobalSlashQueueSize *uint
+ }{
+ ValBalances: chainState.ValBalances,
+ Proposals: &proposalsWithTypes,
+ ValPowers: chainState.ValPowers,
+ RepresentativePowers: chainState.RepresentativePowers,
+ Params: chainState.Params,
+ Rewards: chainState.Rewards,
+ ConsumerChains: chainState.ConsumerChains,
+ AssignedKeys: chainState.AssignedKeys,
+ ProviderKeys: chainState.ProviderKeys,
+ ConsumerChainQueueSizes: chainState.ConsumerChainQueueSizes,
+ GlobalSlashQueueSize: chainState.GlobalSlashQueueSize,
+ }
+
+ return json.Marshal(result)
+}
+
+func (state *ChainState) UnmarshalJSON(data []byte) error {
+ var tmp struct {
+ ValBalances map[ValidatorID]uint
+ Proposals map[uint]json.RawMessage
+ ValPowers map[ValidatorID]uint
+ RepresentativePowers map[ValidatorID]uint
+ Params []Param
+ Rewards Rewards
+ ConsumerChains map[ChainID]bool
+ AssignedKeys map[ValidatorID]string
+ ProviderKeys map[ValidatorID]string // validatorID: validator provider key
+ ConsumerChainQueueSizes map[ChainID]uint
+ GlobalSlashQueueSize uint
+ }
+
+ if err := json.Unmarshal(data, &tmp); err != nil {
+ return err
+ }
+
+ proposals, err := UnmarshalProposals(tmp.Proposals)
+ if err != nil {
+ return err
+ }
+ state.Proposals = proposals
+
+ state.ValBalances = &tmp.ValBalances
+ state.ValPowers = &tmp.ValPowers
+ state.RepresentativePowers = &tmp.RepresentativePowers
+ state.Params = &tmp.Params
+ state.Rewards = &tmp.Rewards
+ state.ConsumerChains = &tmp.ConsumerChains
+ state.AssignedKeys = &tmp.AssignedKeys
+ state.ProviderKeys = &tmp.ProviderKeys
+ state.ConsumerChainQueueSizes = &tmp.ConsumerChainQueueSizes
+ state.GlobalSlashQueueSize = &tmp.GlobalSlashQueueSize
+
+ return nil
+}
+
+func UnmarshalProposals(proposals map[uint]json.RawMessage) (*map[uint]Proposal, error) {
+ result := make(map[uint]Proposal, len(proposals))
+
+ for k, v := range proposals {
+ var tmp struct {
+ Proposal map[string]any
+ ProposalType string
+ }
+
+ if err := json.Unmarshal(v, &tmp); err != nil {
+ return nil, err
+ }
+
+ proposal, err := UnmarshalMapToProposalType(tmp.Proposal, tmp.ProposalType)
+ if err != nil {
+ return nil, err
+ }
+ result[k] = proposal
+ }
+
+ return &result, nil
+}
+
+// UnmarshalMapToActionType takes a JSON object and an action type and marshals into an object of the corresponding action.
+func UnmarshalMapToProposalType(inputMap map[string]any, proposalType string) (Proposal, error) {
+ switch proposalType {
+ case "main.ConsumerAdditionProposal":
+ var proposal ConsumerAdditionProposal
+ err := mapstructure.Decode(inputMap, &proposal)
+ if err != nil {
+ return nil, err
+ }
+ return proposal, nil
+ case "main.ConsumerRemovalProposal":
+ var proposal ConsumerRemovalProposal
+ err := mapstructure.Decode(inputMap, &proposal)
+ if err != nil {
+ return nil, err
+ }
+ return proposal, nil
+ case "main.EquivocationProposal":
+ var proposal EquivocationProposal
+ err := mapstructure.Decode(inputMap, &proposal)
+ if err != nil {
+ return nil, err
+ }
+ return proposal, nil
+
+ case "main.TextProposal":
+ var proposal TextProposal
+ err := mapstructure.Decode(inputMap, &proposal)
+ if err != nil {
+ return nil, err
+ }
+ return proposal, nil
+ default:
+ return nil, fmt.Errorf("%s is not a known action type", proposalType)
+ }
+}
diff --git a/tests/e2e/json_step_marshalling.go b/tests/e2e/json_step_marshalling.go
index e36a8b56f2..793a5e97c3 100644
--- a/tests/e2e/json_step_marshalling.go
+++ b/tests/e2e/json_step_marshalling.go
@@ -8,6 +8,7 @@ import (
"github.com/mitchellh/mapstructure"
)
+// MarshalJSON marshals a step into JSON while including the type of the action.
func (step Step) MarshalJSON() ([]byte, error) {
actionType := reflect.TypeOf(step.Action).String()
@@ -24,6 +25,7 @@ func (step Step) MarshalJSON() ([]byte, error) {
return json.Marshal(result)
}
+// UnmarshalJSON unmarshals a step from JSON while including the type of the action.
func (step *Step) UnmarshalJSON(data []byte) error {
var tmp struct {
ActionType string
From 5908bff2390bbe7b131b48cb1f415470fe08519b Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Wed, 26 Apr 2023 12:41:32 +0200
Subject: [PATCH 07/35] Export unexported field
---
tests/e2e/actions.go | 22 +++++++++++-----------
tests/e2e/steps_start_chains.go | 8 ++++----
2 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/tests/e2e/actions.go b/tests/e2e/actions.go
index 90f32d7568..d32b92ff96 100644
--- a/tests/e2e/actions.go
+++ b/tests/e2e/actions.go
@@ -514,10 +514,10 @@ func (tr TestRun) voteGovProposal(
}
type startConsumerChainAction struct {
- consumerChain ChainID
- providerChain ChainID
- validators []StartChainValidator
- genesisChanges string
+ ConsumerChain ChainID
+ ProviderChain ChainID
+ Validators []StartChainValidator
+ GenesisChanges string
}
func (tr TestRun) startConsumerChain(
@@ -525,12 +525,12 @@ func (tr TestRun) startConsumerChain(
verbose bool,
) {
//#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments.
- cmd := exec.Command("docker", "exec", tr.containerConfig.InstanceName, tr.chainConfigs[action.providerChain].BinaryName,
+ cmd := exec.Command("docker", "exec", tr.containerConfig.InstanceName, tr.chainConfigs[action.ProviderChain].BinaryName,
"query", "provider", "consumer-genesis",
- string(tr.chainConfigs[action.consumerChain].ChainId),
+ string(tr.chainConfigs[action.ConsumerChain].ChainId),
- `--node`, tr.getQueryNode(action.providerChain),
+ `--node`, tr.getQueryNode(action.ProviderChain),
`-o`, `json`,
)
@@ -544,14 +544,14 @@ func (tr TestRun) startConsumerChain(
}
consumerGenesis := ".app_state.ccvconsumer = " + string(bz)
- consumerGenesisChanges := tr.chainConfigs[action.consumerChain].GenesisChanges
+ consumerGenesisChanges := tr.chainConfigs[action.ConsumerChain].GenesisChanges
if consumerGenesisChanges != "" {
- consumerGenesis = consumerGenesis + " | " + consumerGenesisChanges + " | " + action.genesisChanges
+ consumerGenesis = consumerGenesis + " | " + consumerGenesisChanges + " | " + action.GenesisChanges
}
tr.startChain(StartChainAction{
- Chain: action.consumerChain,
- Validators: action.validators,
+ Chain: action.ConsumerChain,
+ Validators: action.Validators,
GenesisChanges: consumerGenesis,
SkipGentx: true,
}, verbose)
diff --git a/tests/e2e/steps_start_chains.go b/tests/e2e/steps_start_chains.go
index 09af900578..87ae1cc2d0 100644
--- a/tests/e2e/steps_start_chains.go
+++ b/tests/e2e/steps_start_chains.go
@@ -140,9 +140,9 @@ func stepsStartConsumerChain(consumerName string, proposalIndex, chainIndex uint
},
{
Action: startConsumerChainAction{
- consumerChain: ChainID(consumerName),
- providerChain: ChainID("provi"),
- validators: []StartChainValidator{
+ ConsumerChain: ChainID(consumerName),
+ ProviderChain: ChainID("provi"),
+ Validators: []StartChainValidator{
{Id: ValidatorID("bob"), Stake: 500000000, Allocation: 10000000000},
{Id: ValidatorID("alice"), Stake: 500000000, Allocation: 10000000000},
{Id: ValidatorID("carol"), Stake: 500000000, Allocation: 10000000000},
@@ -152,7 +152,7 @@ func stepsStartConsumerChain(consumerName string, proposalIndex, chainIndex uint
// soft opt-out threshold to 0.05 in the consumer genesis to ensure that the
// consumer binary doesn't panic. Sdk requires that all params are set to valid
// values from the genesis file.
- genesisChanges: ".app_state.ccvconsumer.params.soft_opt_out_threshold = \"0.05\"",
+ GenesisChanges: ".app_state.ccvconsumer.params.soft_opt_out_threshold = \"0.05\"",
},
State: State{
ChainID("provi"): ChainState{
From 7144640f9ca19803a057cde7076333c4b4433e60 Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Wed, 26 Apr 2023 13:09:44 +0200
Subject: [PATCH 08/35] Add test for marshal/unmarshalling chain state
---
tests/e2e/trace_handlers_test.go | 44 ++++++++++++++++++++++++++++++++
1 file changed, 44 insertions(+)
diff --git a/tests/e2e/trace_handlers_test.go b/tests/e2e/trace_handlers_test.go
index 5a6b45e033..3e7c10b0f4 100644
--- a/tests/e2e/trace_handlers_test.go
+++ b/tests/e2e/trace_handlers_test.go
@@ -1,11 +1,13 @@
package main
import (
+ "encoding/json"
"log"
"os"
"path/filepath"
"testing"
+ clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types"
"github.com/google/go-cmp/cmp"
)
@@ -77,3 +79,45 @@ func TestWriteExamples(t *testing.T) {
})
}
}
+
+func TestMarshalAndUnmarshalChainState(t *testing.T) {
+ tests := map[string]struct {
+ chainState ChainState
+ }{
+ "start_provider_chain": {ChainState{
+ ValBalances: &map[ValidatorID]uint{
+ ValidatorID("alice"): 9489999999,
+ ValidatorID("bob"): 9500000000,
+ },
+ Proposals: &map[uint]Proposal{
+ 2: ConsumerAdditionProposal{
+ Deposit: 10000001,
+ Chain: ChainID("test"),
+ SpawnTime: 0,
+ InitialHeight: clienttypes.Height{RevisionNumber: 0, RevisionHeight: 1},
+ Status: "PROPOSAL_STATUS_VOTING_PERIOD",
+ },
+ },
+ }},
+ }
+
+ for name, tc := range tests {
+ t.Run(name, func(t *testing.T) {
+ jsonobj, err := json.Marshal(tc.chainState)
+ if err != nil {
+ t.Fatalf("error marshalling chain state: %v", err)
+ }
+
+ var got *ChainState
+ err = json.Unmarshal(jsonobj, &got)
+ if err != nil {
+ t.Fatalf("error unmarshalling chain state: %v", err)
+ }
+
+ diff := cmp.Diff(tc.chainState, *got)
+ if diff != "" {
+ t.Fatalf(diff)
+ }
+ })
+ }
+}
From 163e39d38d398f95d4c995f8b691eb9e424ee936 Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Wed, 26 Apr 2023 13:10:16 +0200
Subject: [PATCH 09/35] Fix pointer issues
---
tests/e2e/json_chainState_marshalling.go | 57 +++++++++++++-----------
1 file changed, 31 insertions(+), 26 deletions(-)
diff --git a/tests/e2e/json_chainState_marshalling.go b/tests/e2e/json_chainState_marshalling.go
index 1d32282e14..dde23f8ab0 100644
--- a/tests/e2e/json_chainState_marshalling.go
+++ b/tests/e2e/json_chainState_marshalling.go
@@ -26,7 +26,7 @@ func (chainState ChainState) MarshalJSON() ([]byte, error) {
}
}
} else {
- proposalsWithTypes = make(map[uint]ProposalWithType, 0)
+ proposalsWithTypes = nil
}
result := struct {
@@ -60,39 +60,44 @@ func (chainState ChainState) MarshalJSON() ([]byte, error) {
func (state *ChainState) UnmarshalJSON(data []byte) error {
var tmp struct {
- ValBalances map[ValidatorID]uint
- Proposals map[uint]json.RawMessage
- ValPowers map[ValidatorID]uint
- RepresentativePowers map[ValidatorID]uint
- Params []Param
- Rewards Rewards
- ConsumerChains map[ChainID]bool
- AssignedKeys map[ValidatorID]string
- ProviderKeys map[ValidatorID]string // validatorID: validator provider key
- ConsumerChainQueueSizes map[ChainID]uint
- GlobalSlashQueueSize uint
+ ValBalances *map[ValidatorID]uint
+ Proposals *map[uint]json.RawMessage
+ ValPowers *map[ValidatorID]uint
+ RepresentativePowers *map[ValidatorID]uint
+ Params *[]Param
+ Rewards *Rewards
+ ConsumerChains *map[ChainID]bool
+ AssignedKeys *map[ValidatorID]string
+ ProviderKeys *map[ValidatorID]string // validatorID: validator provider key
+ ConsumerChainQueueSizes *map[ChainID]uint
+ GlobalSlashQueueSize *uint
}
- if err := json.Unmarshal(data, &tmp); err != nil {
+ err := json.Unmarshal(data, &tmp)
+ if err != nil {
return err
}
- proposals, err := UnmarshalProposals(tmp.Proposals)
- if err != nil {
- return err
+ var proposals *map[uint]Proposal
+ if tmp.Proposals != nil {
+ proposals, err = UnmarshalProposals(*tmp.Proposals)
+ if err != nil {
+ return err
+ }
}
+
state.Proposals = proposals
- state.ValBalances = &tmp.ValBalances
- state.ValPowers = &tmp.ValPowers
- state.RepresentativePowers = &tmp.RepresentativePowers
- state.Params = &tmp.Params
- state.Rewards = &tmp.Rewards
- state.ConsumerChains = &tmp.ConsumerChains
- state.AssignedKeys = &tmp.AssignedKeys
- state.ProviderKeys = &tmp.ProviderKeys
- state.ConsumerChainQueueSizes = &tmp.ConsumerChainQueueSizes
- state.GlobalSlashQueueSize = &tmp.GlobalSlashQueueSize
+ state.ValBalances = tmp.ValBalances
+ state.ValPowers = tmp.ValPowers
+ state.RepresentativePowers = tmp.RepresentativePowers
+ state.Params = tmp.Params
+ state.Rewards = tmp.Rewards
+ state.ConsumerChains = tmp.ConsumerChains
+ state.AssignedKeys = tmp.AssignedKeys
+ state.ProviderKeys = tmp.ProviderKeys
+ state.ConsumerChainQueueSizes = tmp.ConsumerChainQueueSizes
+ state.GlobalSlashQueueSize = tmp.GlobalSlashQueueSize
return nil
}
From bd7dc4599ac18349b73a5e9dd1b140ef9c598499 Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Wed, 26 Apr 2023 13:15:43 +0200
Subject: [PATCH 10/35] Fix typo: action -> proposal
---
tests/e2e/json_chainState_marshalling.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/e2e/json_chainState_marshalling.go b/tests/e2e/json_chainState_marshalling.go
index dde23f8ab0..9010cb37cc 100644
--- a/tests/e2e/json_chainState_marshalling.go
+++ b/tests/e2e/json_chainState_marshalling.go
@@ -158,6 +158,6 @@ func UnmarshalMapToProposalType(inputMap map[string]any, proposalType string) (P
}
return proposal, nil
default:
- return nil, fmt.Errorf("%s is not a known action type", proposalType)
+ return nil, fmt.Errorf("%s is not a known proposal type", proposalType)
}
}
From ed4a6471b5076eefb28ebfdc60cb62956094f7d1 Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Thu, 27 Apr 2023 09:19:03 +0200
Subject: [PATCH 11/35] Log proposal string in test
---
tests/e2e/trace_handlers_test.go | 1 +
1 file changed, 1 insertion(+)
diff --git a/tests/e2e/trace_handlers_test.go b/tests/e2e/trace_handlers_test.go
index 3e7c10b0f4..5226cfcbe6 100644
--- a/tests/e2e/trace_handlers_test.go
+++ b/tests/e2e/trace_handlers_test.go
@@ -116,6 +116,7 @@ func TestMarshalAndUnmarshalChainState(t *testing.T) {
diff := cmp.Diff(tc.chainState, *got)
if diff != "" {
+ log.Print(string(jsonobj))
t.Fatalf(diff)
}
})
From 7f03bc3493ef221bf65d7667973966435787f9fc Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Thu, 27 Apr 2023 09:19:20 +0200
Subject: [PATCH 12/35] Use json.RawMessage instead of map[string]any
---
tests/e2e/json_chainState_marshalling.go | 16 +++++++---------
1 file changed, 7 insertions(+), 9 deletions(-)
diff --git a/tests/e2e/json_chainState_marshalling.go b/tests/e2e/json_chainState_marshalling.go
index 9010cb37cc..618b93e067 100644
--- a/tests/e2e/json_chainState_marshalling.go
+++ b/tests/e2e/json_chainState_marshalling.go
@@ -4,8 +4,6 @@ import (
"encoding/json"
"fmt"
"reflect"
-
- "github.com/mitchellh/mapstructure"
)
type ProposalWithType struct {
@@ -107,7 +105,7 @@ func UnmarshalProposals(proposals map[uint]json.RawMessage) (*map[uint]Proposal,
for k, v := range proposals {
var tmp struct {
- Proposal map[string]any
+ Proposal json.RawMessage
ProposalType string
}
@@ -125,26 +123,26 @@ func UnmarshalProposals(proposals map[uint]json.RawMessage) (*map[uint]Proposal,
return &result, nil
}
-// UnmarshalMapToActionType takes a JSON object and an action type and marshals into an object of the corresponding action.
-func UnmarshalMapToProposalType(inputMap map[string]any, proposalType string) (Proposal, error) {
+// UnmarshalMapToProposalType takes a JSON message and a proposal type and marshals into an object of the corresponding proposal.
+func UnmarshalMapToProposalType(input json.RawMessage, proposalType string) (Proposal, error) {
switch proposalType {
case "main.ConsumerAdditionProposal":
var proposal ConsumerAdditionProposal
- err := mapstructure.Decode(inputMap, &proposal)
+ err := json.Unmarshal(input, &proposal)
if err != nil {
return nil, err
}
return proposal, nil
case "main.ConsumerRemovalProposal":
var proposal ConsumerRemovalProposal
- err := mapstructure.Decode(inputMap, &proposal)
+ err := json.Unmarshal(input, &proposal)
if err != nil {
return nil, err
}
return proposal, nil
case "main.EquivocationProposal":
var proposal EquivocationProposal
- err := mapstructure.Decode(inputMap, &proposal)
+ err := json.Unmarshal(input, &proposal)
if err != nil {
return nil, err
}
@@ -152,7 +150,7 @@ func UnmarshalMapToProposalType(inputMap map[string]any, proposalType string) (P
case "main.TextProposal":
var proposal TextProposal
- err := mapstructure.Decode(inputMap, &proposal)
+ err := json.Unmarshal(input, &proposal)
if err != nil {
return nil, err
}
From e731ef162b70e5785a1a496f60efc896d69e2d71 Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Thu, 27 Apr 2023 09:20:31 +0200
Subject: [PATCH 13/35] For uniformity, also use RawMessage for step
unmarshalling
---
tests/e2e/json_step_marshalling.go | 56 ++++++++++++++----------------
1 file changed, 27 insertions(+), 29 deletions(-)
diff --git a/tests/e2e/json_step_marshalling.go b/tests/e2e/json_step_marshalling.go
index 793a5e97c3..bb0a8ebac0 100644
--- a/tests/e2e/json_step_marshalling.go
+++ b/tests/e2e/json_step_marshalling.go
@@ -4,8 +4,6 @@ import (
"encoding/json"
"fmt"
"reflect"
-
- "github.com/mitchellh/mapstructure"
)
// MarshalJSON marshals a step into JSON while including the type of the action.
@@ -29,7 +27,7 @@ func (step Step) MarshalJSON() ([]byte, error) {
func (step *Step) UnmarshalJSON(data []byte) error {
var tmp struct {
ActionType string
- Action map[string]any
+ Action json.RawMessage
State State
}
if err := json.Unmarshal(data, &tmp); err != nil {
@@ -47,81 +45,81 @@ func (step *Step) UnmarshalJSON(data []byte) error {
}
// UnmarshalMapToActionType takes a JSON object and an action type and marshals into an object of the corresponding action.
-func UnmarshalMapToActionType(inputMap map[string]any, actionType string) (interface{}, error) {
+func UnmarshalMapToActionType(input json.RawMessage, actionType string) (interface{}, error) {
switch actionType {
case "main.StartChainAction":
var action StartChainAction
- err := mapstructure.Decode(inputMap, &action)
+ err := json.Unmarshal(input, &action)
if err != nil {
return nil, err
}
return action, nil
case "main.SendTokensAction":
var action SendTokensAction
- err := mapstructure.Decode(inputMap, &action)
+ err := json.Unmarshal(input, &action)
if err != nil {
return nil, err
}
return action, nil
case "main.submitTextProposalAction":
var action submitTextProposalAction
- err := mapstructure.Decode(inputMap, &action)
+ err := json.Unmarshal(input, &action)
if err != nil {
return nil, err
}
return action, nil
case "main.submitConsumerAdditionProposalAction":
var action submitConsumerAdditionProposalAction
- err := mapstructure.Decode(inputMap, &action)
+ err := json.Unmarshal(input, &action)
if err != nil {
return nil, err
}
return action, nil
case "main.submitConsumerRemovalProposalAction":
var action submitConsumerRemovalProposalAction
- err := mapstructure.Decode(inputMap, &action)
+ err := json.Unmarshal(input, &action)
if err != nil {
return nil, err
}
return action, nil
case "main.submitEquivocationProposalAction":
var action submitEquivocationProposalAction
- err := mapstructure.Decode(inputMap, &action)
+ err := json.Unmarshal(input, &action)
if err != nil {
return nil, err
}
return action, nil
case "main.submitParamChangeProposalAction":
var action submitParamChangeProposalAction
- err := mapstructure.Decode(inputMap, &action)
+ err := json.Unmarshal(input, &action)
if err != nil {
return nil, err
}
return action, nil
case "main.voteGovProposalAction":
var action voteGovProposalAction
- err := mapstructure.Decode(inputMap, &action)
+ err := json.Unmarshal(input, &action)
if err != nil {
return nil, err
}
return action, nil
case "main.startConsumerChainAction":
var action startConsumerChainAction
- err := mapstructure.Decode(inputMap, &action)
+ err := json.Unmarshal(input, &action)
if err != nil {
return nil, err
}
return action, nil
case "main.addChainToRelayerAction":
var action addChainToRelayerAction
- err := mapstructure.Decode(inputMap, &action)
+ err := json.Unmarshal(input, &action)
if err != nil {
return nil, err
}
return action, nil
case "main.addIbcConnectionAction":
var action addIbcConnectionAction
- err := mapstructure.Decode(inputMap, &action)
+ err := json.Unmarshal(input, &action)
if err != nil {
return nil, err
}
@@ -129,7 +127,7 @@ func UnmarshalMapToActionType(inputMap map[string]any, actionType string) (inter
case "main.addIbcChannelAction":
var action addIbcChannelAction
- err := mapstructure.Decode(inputMap, &action)
+ err := json.Unmarshal(input, &action)
if err != nil {
return nil, err
}
@@ -137,7 +135,7 @@ func UnmarshalMapToActionType(inputMap map[string]any, actionType string) (inter
case "main.transferChannelCompleteAction":
var action transferChannelCompleteAction
- err := mapstructure.Decode(inputMap, &action)
+ err := json.Unmarshal(input, &action)
if err != nil {
return nil, err
}
@@ -145,7 +143,7 @@ func UnmarshalMapToActionType(inputMap map[string]any, actionType string) (inter
case "main.relayPacketsAction":
var action relayPacketsAction
- err := mapstructure.Decode(inputMap, &action)
+ err := json.Unmarshal(input, &action)
if err != nil {
return nil, err
}
@@ -153,7 +151,7 @@ func UnmarshalMapToActionType(inputMap map[string]any, actionType string) (inter
case "main.relayRewardPacketsToProviderAction":
var action relayRewardPacketsToProviderAction
- err := mapstructure.Decode(inputMap, &action)
+ err := json.Unmarshal(input, &action)
if err != nil {
return nil, err
}
@@ -161,7 +159,7 @@ func UnmarshalMapToActionType(inputMap map[string]any, actionType string) (inter
case "main.delegateTokensAction":
var action delegateTokensAction
- err := mapstructure.Decode(inputMap, &action)
+ err := json.Unmarshal(input, &action)
if err != nil {
return nil, err
}
@@ -169,7 +167,7 @@ func UnmarshalMapToActionType(inputMap map[string]any, actionType string) (inter
case "main.unbondTokensAction":
var action unbondTokensAction
- err := mapstructure.Decode(inputMap, &action)
+ err := json.Unmarshal(input, &action)
if err != nil {
return nil, err
}
@@ -177,56 +175,56 @@ func UnmarshalMapToActionType(inputMap map[string]any, actionType string) (inter
case "main.redelegateTokensAction":
var action redelegateTokensAction
- err := mapstructure.Decode(inputMap, &action)
+ err := json.Unmarshal(input, &action)
if err != nil {
return nil, err
}
return action, nil
case "main.downtimeSlashAction":
var action downtimeSlashAction
- err := mapstructure.Decode(inputMap, &action)
+ err := json.Unmarshal(input, &action)
if err != nil {
return nil, err
}
return action, nil
case "main.unjailValidatorAction":
var action unjailValidatorAction
- err := mapstructure.Decode(inputMap, &action)
+ err := json.Unmarshal(input, &action)
if err != nil {
return nil, err
}
return action, nil
case "main.doublesignSlashAction":
var action doublesignSlashAction
- err := mapstructure.Decode(inputMap, &action)
+ err := json.Unmarshal(input, &action)
if err != nil {
return nil, err
}
return action, nil
case "main.registerRepresentativeAction":
var action registerRepresentativeAction
- err := mapstructure.Decode(inputMap, &action)
+ err := json.Unmarshal(input, &action)
if err != nil {
return nil, err
}
return action, nil
case "main.assignConsumerPubKeyAction":
var action assignConsumerPubKeyAction
- err := mapstructure.Decode(inputMap, &action)
+ err := json.Unmarshal(input, &action)
if err != nil {
return nil, err
}
return action, nil
case "main.slashThrottleDequeue":
var action slashThrottleDequeue
- err := mapstructure.Decode(inputMap, &action)
+ err := json.Unmarshal(input, &action)
if err != nil {
return nil, err
}
return action, nil
case "main.startHermesAction":
var action startHermesAction
- err := mapstructure.Decode(inputMap, &action)
+ err := json.Unmarshal(input, &action)
if err != nil {
return nil, err
}
From 9aaec61354e1932aef240d7b1bc53a5c23a1ca98 Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Thu, 27 Apr 2023 12:15:18 +0200
Subject: [PATCH 14/35] Add tests for extra proposal types
---
tests/e2e/trace_handlers_test.go | 31 ++++++++++++++++++++++++++++++-
1 file changed, 30 insertions(+), 1 deletion(-)
diff --git a/tests/e2e/trace_handlers_test.go b/tests/e2e/trace_handlers_test.go
index 5226cfcbe6..66b1c8cfbb 100644
--- a/tests/e2e/trace_handlers_test.go
+++ b/tests/e2e/trace_handlers_test.go
@@ -94,11 +94,40 @@ func TestMarshalAndUnmarshalChainState(t *testing.T) {
Deposit: 10000001,
Chain: ChainID("test"),
SpawnTime: 0,
- InitialHeight: clienttypes.Height{RevisionNumber: 0, RevisionHeight: 1},
+ InitialHeight: clienttypes.Height{RevisionNumber: 5, RevisionHeight: 5},
Status: "PROPOSAL_STATUS_VOTING_PERIOD",
},
},
}},
+ "democracy": {ChainState{
+ ValBalances: &map[ValidatorID]uint{
+ ValidatorID("alice"): 9889999998,
+ ValidatorID("bob"): 9960000001,
+ },
+ Proposals: &map[uint]Proposal{
+ 1: ParamsProposal{
+ Deposit: 10000001,
+ Status: "PROPOSAL_STATUS_VOTING_PERIOD",
+ Subspace: "staking",
+ Key: "MaxValidators",
+ Value: "105",
+ },
+ },
+ }},
+ "consuemr-removal": {ChainState{
+ Proposals: &map[uint]Proposal{
+ 5: ConsumerRemovalProposal{
+ Deposit: 10000001,
+ Chain: ChainID("test123"),
+ StopTime: 5000000000,
+ Status: "PROPOSAL_STATUS_PASSED",
+ },
+ },
+ ValBalances: &map[ValidatorID]uint{
+ ValidatorID("bob"): 9500000000,
+ },
+ ConsumerChains: &map[ChainID]bool{}, // Consumer chain is now removed
+ }},
}
for name, tc := range tests {
From 87ed74ae1f4f3035090233872a54a37f01a95adc Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Thu, 27 Apr 2023 12:20:25 +0200
Subject: [PATCH 15/35] Add more proposal types to test and unify names
---
tests/e2e/trace_handlers_test.go | 39 +++++++++++++++++++++++++++++---
1 file changed, 36 insertions(+), 3 deletions(-)
diff --git a/tests/e2e/trace_handlers_test.go b/tests/e2e/trace_handlers_test.go
index 66b1c8cfbb..ccebc22484 100644
--- a/tests/e2e/trace_handlers_test.go
+++ b/tests/e2e/trace_handlers_test.go
@@ -84,7 +84,7 @@ func TestMarshalAndUnmarshalChainState(t *testing.T) {
tests := map[string]struct {
chainState ChainState
}{
- "start_provider_chain": {ChainState{
+ "consumer addition proposal": {ChainState{
ValBalances: &map[ValidatorID]uint{
ValidatorID("alice"): 9489999999,
ValidatorID("bob"): 9500000000,
@@ -99,7 +99,7 @@ func TestMarshalAndUnmarshalChainState(t *testing.T) {
},
},
}},
- "democracy": {ChainState{
+ "params-proposal": {ChainState{
ValBalances: &map[ValidatorID]uint{
ValidatorID("alice"): 9889999998,
ValidatorID("bob"): 9960000001,
@@ -114,7 +114,7 @@ func TestMarshalAndUnmarshalChainState(t *testing.T) {
},
},
}},
- "consuemr-removal": {ChainState{
+ "consuemr removal proposal": {ChainState{
Proposals: &map[uint]Proposal{
5: ConsumerRemovalProposal{
Deposit: 10000001,
@@ -128,6 +128,39 @@ func TestMarshalAndUnmarshalChainState(t *testing.T) {
},
ConsumerChains: &map[ChainID]bool{}, // Consumer chain is now removed
}},
+ "text-proposal": {ChainState{
+ ValPowers: &map[ValidatorID]uint{
+ ValidatorID("alice"): 509,
+ ValidatorID("bob"): 500,
+ ValidatorID("carol"): 495,
+ },
+ ValBalances: &map[ValidatorID]uint{
+ ValidatorID("bob"): 9500000000,
+ },
+ Proposals: &map[uint]Proposal{
+ // proposal does not exist
+ 10: TextProposal{},
+ },
+ }},
+ "equivocation-proposal": {ChainState{
+ ValPowers: &map[ValidatorID]uint{
+ ValidatorID("alice"): 509,
+ ValidatorID("bob"): 500,
+ ValidatorID("carol"): 0,
+ },
+ ValBalances: &map[ValidatorID]uint{
+ ValidatorID("bob"): 9489999999,
+ },
+ Proposals: &map[uint]Proposal{
+ 5: EquivocationProposal{
+ Deposit: 10000001,
+ Status: "PROPOSAL_STATUS_VOTING_PERIOD",
+ ConsensusAddress: "cosmosvalcons1nx7n5uh0ztxsynn4sje6eyq2ud6rc6klc96w39",
+ Power: 500,
+ Height: 10,
+ },
+ },
+ }},
}
for name, tc := range tests {
From e2f34e9234c88910c6a8543f31ac429991322468 Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Thu, 27 Apr 2023 12:24:35 +0200
Subject: [PATCH 16/35] Add handling for ParamsProposal
---
tests/e2e/json_chainState_marshalling.go | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/tests/e2e/json_chainState_marshalling.go b/tests/e2e/json_chainState_marshalling.go
index 618b93e067..c5ec20c981 100644
--- a/tests/e2e/json_chainState_marshalling.go
+++ b/tests/e2e/json_chainState_marshalling.go
@@ -147,6 +147,13 @@ func UnmarshalMapToProposalType(input json.RawMessage, proposalType string) (Pro
return nil, err
}
return proposal, nil
+ case "main.ParamsProposal":
+ var proposal ParamsProposal
+ err := json.Unmarshal(input, &proposal)
+ if err != nil {
+ return nil, err
+ }
+ return proposal, nil
case "main.TextProposal":
var proposal TextProposal
From 26b6b45168991400743c869e7fcc061ecc229cfb Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Thu, 27 Apr 2023 12:25:24 +0200
Subject: [PATCH 17/35] Regenerate traces
---
tests/e2e/tracehandler_testdata/democracy.json | 2 +-
tests/e2e/tracehandler_testdata/happyPath.json | 2 +-
tests/e2e/tracehandler_testdata/multipleConsumers.json | 2 +-
tests/e2e/tracehandler_testdata/slashThrottleSteps.json | 2 +-
tests/e2e/tracehandler_testdata/start_provider_chain.json | 2 +-
5 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/tests/e2e/tracehandler_testdata/democracy.json b/tests/e2e/tracehandler_testdata/democracy.json
index 2e7801d1f1..1cc8bc57fe 100644
--- a/tests/e2e/tracehandler_testdata/democracy.json
+++ b/tests/e2e/tracehandler_testdata/democracy.json
@@ -1 +1 @@
-[{"Action":{"Chain":"provi","Validators":[{"Id":"bob","Allocation":10000000000,"Stake":500000000},{"Id":"alice","Allocation":10000000000,"Stake":500000000},{"Id":"carol","Allocation":10000000000,"Stake":500000000}],"GenesisChanges":"","SkipGentx":false},"State":{"provi":{"ValBalances":{"alice":9500000000,"bob":9500000000,"carol":9500000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.StartChainAction"},{"Action":{"Chain":"provi","From":"alice","Deposit":10000001,"ConsumerChain":"democ","SpawnTime":0,"InitialHeight":{"revision_height":1}},"State":{"provi":{"ValBalances":{"alice":9489999999,"bob":9500000000},"Proposals":{"1":{"Deposit":10000001,"Chain":"democ","SpawnTime":0,"InitialHeight":{"revision_height":1},"Status":"PROPOSAL_STATUS_VOTING_PERIOD"}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.submitConsumerAdditionProposalAction"},{"Action":{"Chain":"democ","Validator":"carol","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is=\"}","ReconfigureNode":false,"ExpectError":false},"State":{"democ":{"ValBalances":null,"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":{"carol":"cosmosvalcons1kswr5sq599365kcjmhgufevfps9njf43e4lwdk"},"ProviderKeys":{"carol":"cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6"},"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.assignConsumerPubKeyAction"},{"Action":{"Chain":"democ","Validator":"carol","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is=\"}","ReconfigureNode":false,"ExpectError":true},"State":{},"ActionType":"main.assignConsumerPubKeyAction"},{"Action":{"Chain":"democ","Validator":"bob","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is=\"}","ReconfigureNode":false,"ExpectError":true},"State":{"democ":{"ValBalances":null,"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":{"bob":"","carol":"cosmosvalcons1kswr5sq599365kcjmhgufevfps9njf43e4lwdk"},"ProviderKeys":{"carol":"cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6"},"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.assignConsumerPubKeyAction"},{"Action":{"Chain":"provi","From":["alice","bob","carol"],"Vote":["yes","yes","yes"],"PropNumber":1},"State":{"provi":{"ValBalances":{"alice":9500000000,"bob":9500000000},"Proposals":{"1":{"Deposit":10000001,"Chain":"democ","SpawnTime":0,"InitialHeight":{"revision_height":1},"Status":"PROPOSAL_STATUS_PASSED"}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.voteGovProposalAction"},{"Action":{},"State":{"democ":{"ValBalances":{"alice":10000000000,"bob":10000000000,"carol":10000000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":{"alice":9500000000,"bob":9500000000,"carol":9500000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.startConsumerChainAction"},{"Action":{"ChainA":"democ","ChainB":"provi","ClientA":0,"ClientB":0},"State":{},"ActionType":"main.addIbcConnectionAction"},{"Action":{"ChainA":"democ","ChainB":"provi","ConnectionA":0,"PortA":"consumer","PortB":"provider","Order":"ordered"},"State":{},"ActionType":"main.addIbcChannelAction"},{"Action":{"ChainA":"democ","ChainB":"provi","ConnectionA":0,"PortA":"transfer","PortB":"transfer","Order":"unordered","ChannelA":1,"ChannelB":1},"State":{},"ActionType":"main.transferChannelCompleteAction"},{"Action":{"Chain":"provi","From":"alice","To":"alice","Amount":11000000},"State":{"democ":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":500,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.delegateTokensAction"},{"Action":{"Chain":"democ","From":"alice","To":"bob","Amount":1},"State":{"democ":{"ValBalances":{"alice":10000000000,"bob":10000000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.SendTokensAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"democ":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Chain":"democ","From":"alice","To":"bob","Amount":1},"State":{"democ":{"ValBalances":{"alice":9999999999,"bob":10000000001},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.SendTokensAction"},{"Action":{"Chain":"democ","Representatives":["alice","bob"],"Stakes":[100000000,40000000]},"State":{"democ":{"ValBalances":null,"Proposals":null,"ValPowers":null,"RepresentativePowers":{"alice":100000000,"bob":40000000},"Params":null,"Rewards":{"IsRewarded":{"alice":true,"bob":true,"carol":false},"IsIncrementalReward":true,"IsNativeDenom":true},"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.registerRepresentativeAction"},{"Action":{"Chain":"democ","From":"carol","To":"alice","Amount":500000},"State":{"democ":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":{"alice":100500000,"bob":40000000},"Params":null,"Rewards":{"IsRewarded":{"alice":true,"bob":true,"carol":true},"IsIncrementalReward":true,"IsNativeDenom":true},"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.delegateTokensAction"},{"Action":{"Chain":"democ","From":"alice","Deposit":10000001,"Subspace":"staking","Key":"MaxValidators","Value":105},"State":{"democ":{"ValBalances":{"alice":9889999998,"bob":9960000001},"Proposals":{"1":{"Deposit":10000001,"Status":"PROPOSAL_STATUS_VOTING_PERIOD","Subspace":"staking","Key":"MaxValidators","Value":"105"}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.submitParamChangeProposalAction"},{"Action":{"Chain":"democ","From":["alice","bob"],"Vote":["yes","no"],"PropNumber":1},"State":{"democ":{"ValBalances":{"alice":9899999999,"bob":9960000001},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":[{"Subspace":"staking","Key":"MaxValidators","Value":"105"}],"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.voteGovProposalAction"},{"Action":{},"State":{"provi":{"ValBalances":null,"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":{"IsRewarded":{"alice":true,"bob":true,"carol":true},"IsIncrementalReward":false,"IsNativeDenom":false},"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayRewardPacketsToProviderAction"},{"Action":{"Chain":"democ","Validator":"bob"},"State":{"democ":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.downtimeSlashAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"democ":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":0,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"democ":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":0,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Provider":"provi","Validator":"bob"},"State":{"democ":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":0,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.unjailValidatorAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"democ":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":{"alice":100500000,"bob":40000000},"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"}]
\ No newline at end of file
+[{"ActionType":"main.StartChainAction","Action":{"Chain":"provi","Validators":[{"Id":"bob","Allocation":10000000000,"Stake":500000000},{"Id":"alice","Allocation":10000000000,"Stake":500000000},{"Id":"carol","Allocation":10000000000,"Stake":500000000}],"GenesisChanges":"","SkipGentx":false},"State":{"provi":{"ValBalances":{"alice":9500000000,"bob":9500000000,"carol":9500000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.submitConsumerAdditionProposalAction","Action":{"Chain":"provi","From":"alice","Deposit":10000001,"ConsumerChain":"democ","SpawnTime":0,"InitialHeight":{"revision_height":1}},"State":{"provi":{"ValBalances":{"alice":9489999999,"bob":9500000000},"Proposals":{"1":{"ProposalType":"main.ConsumerAdditionProposal","Proposal":{"Deposit":10000001,"Chain":"democ","SpawnTime":0,"InitialHeight":{"revision_height":1},"Status":"PROPOSAL_STATUS_VOTING_PERIOD"}}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.assignConsumerPubKeyAction","Action":{"Chain":"democ","Validator":"carol","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is=\"}","ReconfigureNode":false,"ExpectError":false},"State":{"democ":{"ValBalances":null,"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":{"carol":"cosmosvalcons1kswr5sq599365kcjmhgufevfps9njf43e4lwdk"},"ProviderKeys":{"carol":"cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6"},"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.assignConsumerPubKeyAction","Action":{"Chain":"democ","Validator":"carol","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is=\"}","ReconfigureNode":false,"ExpectError":true},"State":{}},{"ActionType":"main.assignConsumerPubKeyAction","Action":{"Chain":"democ","Validator":"bob","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is=\"}","ReconfigureNode":false,"ExpectError":true},"State":{"democ":{"ValBalances":null,"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":{"bob":"","carol":"cosmosvalcons1kswr5sq599365kcjmhgufevfps9njf43e4lwdk"},"ProviderKeys":{"carol":"cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6"},"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.voteGovProposalAction","Action":{"Chain":"provi","From":["alice","bob","carol"],"Vote":["yes","yes","yes"],"PropNumber":1},"State":{"provi":{"ValBalances":{"alice":9500000000,"bob":9500000000},"Proposals":{"1":{"ProposalType":"main.ConsumerAdditionProposal","Proposal":{"Deposit":10000001,"Chain":"democ","SpawnTime":0,"InitialHeight":{"revision_height":1},"Status":"PROPOSAL_STATUS_PASSED"}}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.startConsumerChainAction","Action":{"ConsumerChain":"democ","ProviderChain":"provi","Validators":[{"Id":"bob","Allocation":10000000000,"Stake":500000000},{"Id":"alice","Allocation":10000000000,"Stake":500000000},{"Id":"carol","Allocation":10000000000,"Stake":500000000}],"GenesisChanges":".app_state.ccvconsumer.params.soft_opt_out_threshold = \"0.05\""},"State":{"democ":{"ValBalances":{"alice":10000000000,"bob":10000000000,"carol":10000000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":{"alice":9500000000,"bob":9500000000,"carol":9500000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.addIbcConnectionAction","Action":{"ChainA":"democ","ChainB":"provi","ClientA":0,"ClientB":0},"State":{}},{"ActionType":"main.addIbcChannelAction","Action":{"ChainA":"democ","ChainB":"provi","ConnectionA":0,"PortA":"consumer","PortB":"provider","Order":"ordered"},"State":{}},{"ActionType":"main.transferChannelCompleteAction","Action":{"ChainA":"democ","ChainB":"provi","ConnectionA":0,"PortA":"transfer","PortB":"transfer","Order":"unordered","ChannelA":1,"ChannelB":1},"State":{}},{"ActionType":"main.delegateTokensAction","Action":{"Chain":"provi","From":"alice","To":"alice","Amount":11000000},"State":{"democ":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":500,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.SendTokensAction","Action":{"Chain":"democ","From":"alice","To":"bob","Amount":1},"State":{"democ":{"ValBalances":{"alice":10000000000,"bob":10000000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"democ":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.SendTokensAction","Action":{"Chain":"democ","From":"alice","To":"bob","Amount":1},"State":{"democ":{"ValBalances":{"alice":9999999999,"bob":10000000001},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.registerRepresentativeAction","Action":{"Chain":"democ","Representatives":["alice","bob"],"Stakes":[100000000,40000000]},"State":{"democ":{"ValBalances":null,"Proposals":null,"ValPowers":null,"RepresentativePowers":{"alice":100000000,"bob":40000000},"Params":null,"Rewards":{"IsRewarded":{"alice":true,"bob":true,"carol":false},"IsIncrementalReward":true,"IsNativeDenom":true},"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.delegateTokensAction","Action":{"Chain":"democ","From":"carol","To":"alice","Amount":500000},"State":{"democ":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":{"alice":100500000,"bob":40000000},"Params":null,"Rewards":{"IsRewarded":{"alice":true,"bob":true,"carol":true},"IsIncrementalReward":true,"IsNativeDenom":true},"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.submitParamChangeProposalAction","Action":{"Chain":"democ","From":"alice","Deposit":10000001,"Subspace":"staking","Key":"MaxValidators","Value":105},"State":{"democ":{"ValBalances":{"alice":9889999998,"bob":9960000001},"Proposals":{"1":{"ProposalType":"main.ParamsProposal","Proposal":{"Deposit":10000001,"Status":"PROPOSAL_STATUS_VOTING_PERIOD","Subspace":"staking","Key":"MaxValidators","Value":"105"}}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.voteGovProposalAction","Action":{"Chain":"democ","From":["alice","bob"],"Vote":["yes","no"],"PropNumber":1},"State":{"democ":{"ValBalances":{"alice":9899999999,"bob":9960000001},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":[{"Subspace":"staking","Key":"MaxValidators","Value":"105"}],"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayRewardPacketsToProviderAction","Action":{},"State":{"provi":{"ValBalances":null,"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":{"IsRewarded":{"alice":true,"bob":true,"carol":true},"IsIncrementalReward":false,"IsNativeDenom":false},"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.downtimeSlashAction","Action":{"Chain":"democ","Validator":"bob"},"State":{"democ":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"democ":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":0,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"democ":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":0,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.unjailValidatorAction","Action":{"Provider":"provi","Validator":"bob"},"State":{"democ":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":0,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"democ":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":{"alice":100500000,"bob":40000000},"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}}]
\ No newline at end of file
diff --git a/tests/e2e/tracehandler_testdata/happyPath.json b/tests/e2e/tracehandler_testdata/happyPath.json
index 62ff6d8cb0..5c1bf7d098 100644
--- a/tests/e2e/tracehandler_testdata/happyPath.json
+++ b/tests/e2e/tracehandler_testdata/happyPath.json
@@ -1 +1 @@
-[{"Action":{"Chain":"provi","Validators":[{"Id":"bob","Allocation":10000000000,"Stake":500000000},{"Id":"alice","Allocation":10000000000,"Stake":500000000},{"Id":"carol","Allocation":10000000000,"Stake":500000000}],"GenesisChanges":"","SkipGentx":false},"State":{"provi":{"ValBalances":{"alice":9500000000,"bob":9500000000,"carol":9500000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.StartChainAction"},{"Action":{"Chain":"provi","From":"alice","Deposit":10000001,"ConsumerChain":"consu","SpawnTime":0,"InitialHeight":{"revision_height":1}},"State":{"provi":{"ValBalances":{"alice":9489999999,"bob":9500000000},"Proposals":{"1":{"Deposit":10000001,"Chain":"consu","SpawnTime":0,"InitialHeight":{"revision_height":1},"Status":"PROPOSAL_STATUS_VOTING_PERIOD"}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.submitConsumerAdditionProposalAction"},{"Action":{"Chain":"consu","Validator":"carol","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is=\"}","ReconfigureNode":false,"ExpectError":false},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":{"carol":"cosmosvalcons1kswr5sq599365kcjmhgufevfps9njf43e4lwdk"},"ProviderKeys":{"carol":"cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6"},"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.assignConsumerPubKeyAction"},{"Action":{"Chain":"consu","Validator":"carol","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is=\"}","ReconfigureNode":false,"ExpectError":true},"State":{},"ActionType":"main.assignConsumerPubKeyAction"},{"Action":{"Chain":"consu","Validator":"bob","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is=\"}","ReconfigureNode":false,"ExpectError":true},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":{"bob":"","carol":"cosmosvalcons1kswr5sq599365kcjmhgufevfps9njf43e4lwdk"},"ProviderKeys":{"carol":"cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6"},"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.assignConsumerPubKeyAction"},{"Action":{"Chain":"provi","From":["alice","bob","carol"],"Vote":["yes","yes","yes"],"PropNumber":1},"State":{"provi":{"ValBalances":{"alice":9500000000,"bob":9500000000},"Proposals":{"1":{"Deposit":10000001,"Chain":"consu","SpawnTime":0,"InitialHeight":{"revision_height":1},"Status":"PROPOSAL_STATUS_PASSED"}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.voteGovProposalAction"},{"Action":{},"State":{"consu":{"ValBalances":{"alice":10000000000,"bob":10000000000,"carol":10000000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":{"alice":9500000000,"bob":9500000000,"carol":9500000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.startConsumerChainAction"},{"Action":{"ChainA":"consu","ChainB":"provi","ClientA":0,"ClientB":0},"State":{},"ActionType":"main.addIbcConnectionAction"},{"Action":{"ChainA":"consu","ChainB":"provi","ConnectionA":0,"PortA":"consumer","PortB":"provider","Order":"ordered"},"State":{},"ActionType":"main.addIbcChannelAction"},{"Action":{"Chain":"provi","From":"alice","To":"alice","Amount":11000000},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":500,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.delegateTokensAction"},{"Action":{"Chain":"consu","From":"alice","To":"bob","Amount":1},"State":{"consu":{"ValBalances":{"alice":10000000000,"bob":10000000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.SendTokensAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Chain":"consu","From":"alice","To":"bob","Amount":1},"State":{"consu":{"ValBalances":{"alice":9999999999,"bob":10000000001},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.SendTokensAction"},{"Action":{"Chain":"consu","Validator":"bob","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"QlG+iYe6AyYpvY1z9RNJKCVlH14Q/qSz4EjGdGCru3o=\"}","ReconfigureNode":true,"ExpectError":false},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":{"bob":"cosmosvalcons1uuec3cjxajv5te08p220usrjhkfhg9wyvqn0tm","carol":"cosmosvalcons1kswr5sq599365kcjmhgufevfps9njf43e4lwdk"},"ProviderKeys":{"bob":"cosmosvalcons1nx7n5uh0ztxsynn4sje6eyq2ud6rc6klc96w39","carol":"cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6"},"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.assignConsumerPubKeyAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":{"bob":"cosmosvalcons1uuec3cjxajv5te08p220usrjhkfhg9wyvqn0tm","carol":"cosmosvalcons1kswr5sq599365kcjmhgufevfps9njf43e4lwdk"},"ProviderKeys":{"bob":"cosmosvalcons1nx7n5uh0ztxsynn4sje6eyq2ud6rc6klc96w39","carol":"cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6"},"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Chain":"provi","Sender":"alice","UnbondFrom":"alice","Amount":1000000},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":510,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.unbondTokensAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":510,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Chain":"provi","Src":"alice","Dst":"carol","TxSender":"alice","Amount":450000000},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":510,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":60,"bob":500,"carol":950},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.redelegateTokensAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":60,"bob":500,"carol":950},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Chain":"consu","Validator":"alice"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":60,"bob":500,"carol":950},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":60,"bob":500,"carol":950},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.downtimeSlashAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":60,"bob":500,"carol":950},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":60,"bob":500,"carol":950},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Chain":"provi","Src":"carol","Dst":"alice","TxSender":"carol","Amount":449000000},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":60,"bob":500,"carol":950},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.redelegateTokensAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Chain":"consu","Validator":"bob"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.downtimeSlashAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":0,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":0,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Provider":"provi","Validator":"bob"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":0,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.unjailValidatorAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Chain":"provi","Validator":"carol"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.downtimeSlashAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Provider":"provi","Validator":"carol"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":495},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.unjailValidatorAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":495},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Chain":"consu","Height":10,"Time":"2023-04-24T16:56:17.851061+02:00","Power":500,"Validator":"bob","Deposit":10000001,"From":"bob"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":495},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":{"bob":9500000000},"Proposals":{"2":{"Title":"","Description":"","Deposit":0,"Status":""}},"ValPowers":{"alice":509,"bob":500,"carol":495},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.submitEquivocationProposalAction"},{"Action":{"Validator":"carol","Chain":"provi"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":495},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.doublesignSlashAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Validator":"bob","Chain":"consu"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.doublesignSlashAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Chain":"consu","Height":10,"Time":"2023-04-24T16:56:17.851064+02:00","Power":500,"Validator":"bob","Deposit":10000001,"From":"bob"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":{"bob":9489999999},"Proposals":{"2":{"Height":10,"Power":500,"ConsensusAddress":"cosmosvalcons1nx7n5uh0ztxsynn4sje6eyq2ud6rc6klc96w39","Deposit":10000001,"Status":"PROPOSAL_STATUS_VOTING_PERIOD"}},"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.submitEquivocationProposalAction"},{"Action":{"Chain":"provi","From":["alice","bob","carol"],"Vote":["yes","yes","yes"],"PropNumber":2},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":{"2":{"Height":10,"Power":500,"ConsensusAddress":"cosmosvalcons1nx7n5uh0ztxsynn4sje6eyq2ud6rc6klc96w39","Deposit":10000001,"Status":"PROPOSAL_STATUS_PASSED"}},"ValPowers":{"alice":509,"bob":0,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.voteGovProposalAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":0,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":0,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{},"State":{},"ActionType":"main.startHermesAction"},{"Action":{"Chain":"provi","From":"bob","Deposit":10000001,"ConsumerChain":"consu","StopTimeOffset":0},"State":{"provi":{"ValBalances":{"bob":9489999999},"Proposals":{"3":{"Deposit":10000001,"Chain":"consu","StopTime":0,"Status":"PROPOSAL_STATUS_VOTING_PERIOD"}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":{"consu":true},"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.submitConsumerRemovalProposalAction"},{"Action":{"Chain":"provi","From":["alice","bob","carol"],"Vote":["no","no","no"],"PropNumber":3},"State":{"provi":{"ValBalances":{"bob":9500000000},"Proposals":{"3":{"Deposit":10000001,"Chain":"consu","StopTime":0,"Status":"PROPOSAL_STATUS_REJECTED"}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":{"consu":true},"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.voteGovProposalAction"},{"Action":{"Chain":"provi","From":"bob","Deposit":10000001,"ConsumerChain":"consu","StopTimeOffset":0},"State":{"provi":{"ValBalances":{"bob":9489999999},"Proposals":{"4":{"Deposit":10000001,"Chain":"consu","StopTime":0,"Status":"PROPOSAL_STATUS_VOTING_PERIOD"}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":{"consu":true},"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.submitConsumerRemovalProposalAction"},{"Action":{"Chain":"provi","From":["alice","bob","carol"],"Vote":["yes","yes","yes"],"PropNumber":4},"State":{"provi":{"ValBalances":{"bob":9500000000},"Proposals":{"4":{"Deposit":10000001,"Chain":"consu","StopTime":0,"Status":"PROPOSAL_STATUS_PASSED"}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":{},"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.voteGovProposalAction"}]
\ No newline at end of file
+[{"ActionType":"main.StartChainAction","Action":{"Chain":"provi","Validators":[{"Id":"bob","Allocation":10000000000,"Stake":500000000},{"Id":"alice","Allocation":10000000000,"Stake":500000000},{"Id":"carol","Allocation":10000000000,"Stake":500000000}],"GenesisChanges":"","SkipGentx":false},"State":{"provi":{"ValBalances":{"alice":9500000000,"bob":9500000000,"carol":9500000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.submitConsumerAdditionProposalAction","Action":{"Chain":"provi","From":"alice","Deposit":10000001,"ConsumerChain":"consu","SpawnTime":0,"InitialHeight":{"revision_height":1}},"State":{"provi":{"ValBalances":{"alice":9489999999,"bob":9500000000},"Proposals":{"1":{"ProposalType":"main.ConsumerAdditionProposal","Proposal":{"Deposit":10000001,"Chain":"consu","SpawnTime":0,"InitialHeight":{"revision_height":1},"Status":"PROPOSAL_STATUS_VOTING_PERIOD"}}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.assignConsumerPubKeyAction","Action":{"Chain":"consu","Validator":"carol","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is=\"}","ReconfigureNode":false,"ExpectError":false},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":{"carol":"cosmosvalcons1kswr5sq599365kcjmhgufevfps9njf43e4lwdk"},"ProviderKeys":{"carol":"cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6"},"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.assignConsumerPubKeyAction","Action":{"Chain":"consu","Validator":"carol","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is=\"}","ReconfigureNode":false,"ExpectError":true},"State":{}},{"ActionType":"main.assignConsumerPubKeyAction","Action":{"Chain":"consu","Validator":"bob","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is=\"}","ReconfigureNode":false,"ExpectError":true},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":{"bob":"","carol":"cosmosvalcons1kswr5sq599365kcjmhgufevfps9njf43e4lwdk"},"ProviderKeys":{"carol":"cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6"},"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.voteGovProposalAction","Action":{"Chain":"provi","From":["alice","bob","carol"],"Vote":["yes","yes","yes"],"PropNumber":1},"State":{"provi":{"ValBalances":{"alice":9500000000,"bob":9500000000},"Proposals":{"1":{"ProposalType":"main.ConsumerAdditionProposal","Proposal":{"Deposit":10000001,"Chain":"consu","SpawnTime":0,"InitialHeight":{"revision_height":1},"Status":"PROPOSAL_STATUS_PASSED"}}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.startConsumerChainAction","Action":{"ConsumerChain":"consu","ProviderChain":"provi","Validators":[{"Id":"bob","Allocation":10000000000,"Stake":500000000},{"Id":"alice","Allocation":10000000000,"Stake":500000000},{"Id":"carol","Allocation":10000000000,"Stake":500000000}],"GenesisChanges":".app_state.ccvconsumer.params.soft_opt_out_threshold = \"0.05\""},"State":{"consu":{"ValBalances":{"alice":10000000000,"bob":10000000000,"carol":10000000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":{"alice":9500000000,"bob":9500000000,"carol":9500000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.addIbcConnectionAction","Action":{"ChainA":"consu","ChainB":"provi","ClientA":0,"ClientB":0},"State":{}},{"ActionType":"main.addIbcChannelAction","Action":{"ChainA":"consu","ChainB":"provi","ConnectionA":0,"PortA":"consumer","PortB":"provider","Order":"ordered"},"State":{}},{"ActionType":"main.delegateTokensAction","Action":{"Chain":"provi","From":"alice","To":"alice","Amount":11000000},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":500,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.SendTokensAction","Action":{"Chain":"consu","From":"alice","To":"bob","Amount":1},"State":{"consu":{"ValBalances":{"alice":10000000000,"bob":10000000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.SendTokensAction","Action":{"Chain":"consu","From":"alice","To":"bob","Amount":1},"State":{"consu":{"ValBalances":{"alice":9999999999,"bob":10000000001},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.assignConsumerPubKeyAction","Action":{"Chain":"consu","Validator":"bob","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"QlG+iYe6AyYpvY1z9RNJKCVlH14Q/qSz4EjGdGCru3o=\"}","ReconfigureNode":true,"ExpectError":false},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":{"bob":"cosmosvalcons1uuec3cjxajv5te08p220usrjhkfhg9wyvqn0tm","carol":"cosmosvalcons1kswr5sq599365kcjmhgufevfps9njf43e4lwdk"},"ProviderKeys":{"bob":"cosmosvalcons1nx7n5uh0ztxsynn4sje6eyq2ud6rc6klc96w39","carol":"cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6"},"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":{"bob":"cosmosvalcons1uuec3cjxajv5te08p220usrjhkfhg9wyvqn0tm","carol":"cosmosvalcons1kswr5sq599365kcjmhgufevfps9njf43e4lwdk"},"ProviderKeys":{"bob":"cosmosvalcons1nx7n5uh0ztxsynn4sje6eyq2ud6rc6klc96w39","carol":"cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6"},"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.unbondTokensAction","Action":{"Chain":"provi","Sender":"alice","UnbondFrom":"alice","Amount":1000000},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":510,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":510,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.redelegateTokensAction","Action":{"Chain":"provi","Src":"alice","Dst":"carol","TxSender":"alice","Amount":450000000},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":510,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":60,"bob":500,"carol":950},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":60,"bob":500,"carol":950},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.downtimeSlashAction","Action":{"Chain":"consu","Validator":"alice"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":60,"bob":500,"carol":950},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":60,"bob":500,"carol":950},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":60,"bob":500,"carol":950},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":60,"bob":500,"carol":950},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.redelegateTokensAction","Action":{"Chain":"provi","Src":"carol","Dst":"alice","TxSender":"carol","Amount":449000000},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":60,"bob":500,"carol":950},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.downtimeSlashAction","Action":{"Chain":"consu","Validator":"bob"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":0,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":0,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.unjailValidatorAction","Action":{"Provider":"provi","Validator":"bob"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":0,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.downtimeSlashAction","Action":{"Chain":"provi","Validator":"carol"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.unjailValidatorAction","Action":{"Provider":"provi","Validator":"carol"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":495},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":495},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.submitEquivocationProposalAction","Action":{"Chain":"consu","Height":10,"Time":"2023-04-27T12:25:02.372932+02:00","Power":500,"Validator":"bob","Deposit":10000001,"From":"bob"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":495},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":{"bob":9500000000},"Proposals":{"2":{"ProposalType":"main.TextProposal","Proposal":{"Title":"","Description":"","Deposit":0,"Status":""}}},"ValPowers":{"alice":509,"bob":500,"carol":495},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.doublesignSlashAction","Action":{"Validator":"carol","Chain":"provi"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":495},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.doublesignSlashAction","Action":{"Validator":"bob","Chain":"consu"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.submitEquivocationProposalAction","Action":{"Chain":"consu","Height":10,"Time":"2023-04-27T12:25:02.372938+02:00","Power":500,"Validator":"bob","Deposit":10000001,"From":"bob"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":{"bob":9489999999},"Proposals":{"2":{"ProposalType":"main.EquivocationProposal","Proposal":{"Height":10,"Power":500,"ConsensusAddress":"cosmosvalcons1nx7n5uh0ztxsynn4sje6eyq2ud6rc6klc96w39","Deposit":10000001,"Status":"PROPOSAL_STATUS_VOTING_PERIOD"}}},"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.voteGovProposalAction","Action":{"Chain":"provi","From":["alice","bob","carol"],"Vote":["yes","yes","yes"],"PropNumber":2},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":{"2":{"ProposalType":"main.EquivocationProposal","Proposal":{"Height":10,"Power":500,"ConsensusAddress":"cosmosvalcons1nx7n5uh0ztxsynn4sje6eyq2ud6rc6klc96w39","Deposit":10000001,"Status":"PROPOSAL_STATUS_PASSED"}}},"ValPowers":{"alice":509,"bob":0,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":0,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":0,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.startHermesAction","Action":{},"State":{}},{"ActionType":"main.submitConsumerRemovalProposalAction","Action":{"Chain":"provi","From":"bob","Deposit":10000001,"ConsumerChain":"consu","StopTimeOffset":0},"State":{"provi":{"ValBalances":{"bob":9489999999},"Proposals":{"3":{"ProposalType":"main.ConsumerRemovalProposal","Proposal":{"Deposit":10000001,"Chain":"consu","StopTime":0,"Status":"PROPOSAL_STATUS_VOTING_PERIOD"}}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":{"consu":true},"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.voteGovProposalAction","Action":{"Chain":"provi","From":["alice","bob","carol"],"Vote":["no","no","no"],"PropNumber":3},"State":{"provi":{"ValBalances":{"bob":9500000000},"Proposals":{"3":{"ProposalType":"main.ConsumerRemovalProposal","Proposal":{"Deposit":10000001,"Chain":"consu","StopTime":0,"Status":"PROPOSAL_STATUS_REJECTED"}}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":{"consu":true},"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.submitConsumerRemovalProposalAction","Action":{"Chain":"provi","From":"bob","Deposit":10000001,"ConsumerChain":"consu","StopTimeOffset":0},"State":{"provi":{"ValBalances":{"bob":9489999999},"Proposals":{"4":{"ProposalType":"main.ConsumerRemovalProposal","Proposal":{"Deposit":10000001,"Chain":"consu","StopTime":0,"Status":"PROPOSAL_STATUS_VOTING_PERIOD"}}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":{"consu":true},"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.voteGovProposalAction","Action":{"Chain":"provi","From":["alice","bob","carol"],"Vote":["yes","yes","yes"],"PropNumber":4},"State":{"provi":{"ValBalances":{"bob":9500000000},"Proposals":{"4":{"ProposalType":"main.ConsumerRemovalProposal","Proposal":{"Deposit":10000001,"Chain":"consu","StopTime":0,"Status":"PROPOSAL_STATUS_PASSED"}}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":{},"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}}]
\ No newline at end of file
diff --git a/tests/e2e/tracehandler_testdata/multipleConsumers.json b/tests/e2e/tracehandler_testdata/multipleConsumers.json
index 06901eed5c..7d36555422 100644
--- a/tests/e2e/tracehandler_testdata/multipleConsumers.json
+++ b/tests/e2e/tracehandler_testdata/multipleConsumers.json
@@ -1 +1 @@
-[{"Action":{"Chain":"provi","Validators":[{"Id":"bob","Allocation":10000000000,"Stake":500000000},{"Id":"alice","Allocation":10000000000,"Stake":500000000},{"Id":"carol","Allocation":10000000000,"Stake":500000000}],"GenesisChanges":"","SkipGentx":false},"State":{"provi":{"ValBalances":{"alice":9500000000,"bob":9500000000,"carol":9500000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.StartChainAction"},{"Action":{"Chain":"provi","From":"alice","Deposit":10000001,"ConsumerChain":"consu","SpawnTime":0,"InitialHeight":{"revision_height":1}},"State":{"provi":{"ValBalances":{"alice":9489999999,"bob":9500000000},"Proposals":{"1":{"Deposit":10000001,"Chain":"consu","SpawnTime":0,"InitialHeight":{"revision_height":1},"Status":"PROPOSAL_STATUS_VOTING_PERIOD"}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.submitConsumerAdditionProposalAction"},{"Action":{"Chain":"consu","Validator":"carol","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is=\"}","ReconfigureNode":false,"ExpectError":false},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":{"carol":"cosmosvalcons1kswr5sq599365kcjmhgufevfps9njf43e4lwdk"},"ProviderKeys":{"carol":"cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6"},"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.assignConsumerPubKeyAction"},{"Action":{"Chain":"consu","Validator":"carol","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is=\"}","ReconfigureNode":false,"ExpectError":true},"State":{},"ActionType":"main.assignConsumerPubKeyAction"},{"Action":{"Chain":"consu","Validator":"bob","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is=\"}","ReconfigureNode":false,"ExpectError":true},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":{"bob":"","carol":"cosmosvalcons1kswr5sq599365kcjmhgufevfps9njf43e4lwdk"},"ProviderKeys":{"carol":"cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6"},"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.assignConsumerPubKeyAction"},{"Action":{"Chain":"provi","From":["alice","bob","carol"],"Vote":["yes","yes","yes"],"PropNumber":1},"State":{"provi":{"ValBalances":{"alice":9500000000,"bob":9500000000},"Proposals":{"1":{"Deposit":10000001,"Chain":"consu","SpawnTime":0,"InitialHeight":{"revision_height":1},"Status":"PROPOSAL_STATUS_PASSED"}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.voteGovProposalAction"},{"Action":{},"State":{"consu":{"ValBalances":{"alice":10000000000,"bob":10000000000,"carol":10000000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":{"alice":9500000000,"bob":9500000000,"carol":9500000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.startConsumerChainAction"},{"Action":{"ChainA":"consu","ChainB":"provi","ClientA":0,"ClientB":0},"State":{},"ActionType":"main.addIbcConnectionAction"},{"Action":{"ChainA":"consu","ChainB":"provi","ConnectionA":0,"PortA":"consumer","PortB":"provider","Order":"ordered"},"State":{},"ActionType":"main.addIbcChannelAction"},{"Action":{"Chain":"provi","From":"alice","Deposit":10000001,"ConsumerChain":"densu","SpawnTime":0,"InitialHeight":{"revision_height":1}},"State":{"provi":{"ValBalances":{"alice":9489999999,"bob":9500000000},"Proposals":{"2":{"Deposit":10000001,"Chain":"densu","SpawnTime":0,"InitialHeight":{"revision_height":1},"Status":"PROPOSAL_STATUS_VOTING_PERIOD"}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.submitConsumerAdditionProposalAction"},{"Action":{"Chain":"densu","Validator":"carol","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is=\"}","ReconfigureNode":false,"ExpectError":false},"State":{"densu":{"ValBalances":null,"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":{"carol":"cosmosvalcons1kswr5sq599365kcjmhgufevfps9njf43e4lwdk"},"ProviderKeys":{"carol":"cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6"},"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.assignConsumerPubKeyAction"},{"Action":{"Chain":"densu","Validator":"carol","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is=\"}","ReconfigureNode":false,"ExpectError":true},"State":{},"ActionType":"main.assignConsumerPubKeyAction"},{"Action":{"Chain":"densu","Validator":"bob","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is=\"}","ReconfigureNode":false,"ExpectError":true},"State":{"densu":{"ValBalances":null,"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":{"bob":"","carol":"cosmosvalcons1kswr5sq599365kcjmhgufevfps9njf43e4lwdk"},"ProviderKeys":{"carol":"cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6"},"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.assignConsumerPubKeyAction"},{"Action":{"Chain":"provi","From":["alice","bob","carol"],"Vote":["yes","yes","yes"],"PropNumber":2},"State":{"provi":{"ValBalances":{"alice":9500000000,"bob":9500000000},"Proposals":{"2":{"Deposit":10000001,"Chain":"densu","SpawnTime":0,"InitialHeight":{"revision_height":1},"Status":"PROPOSAL_STATUS_PASSED"}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.voteGovProposalAction"},{"Action":{},"State":{"densu":{"ValBalances":{"alice":10000000000,"bob":10000000000,"carol":10000000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":{"alice":9500000000,"bob":9500000000,"carol":9500000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.startConsumerChainAction"},{"Action":{"ChainA":"densu","ChainB":"provi","ClientA":0,"ClientB":1},"State":{},"ActionType":"main.addIbcConnectionAction"},{"Action":{"ChainA":"densu","ChainB":"provi","ConnectionA":0,"PortA":"consumer","PortB":"provider","Order":"ordered"},"State":{},"ActionType":"main.addIbcChannelAction"},{"Action":{"Chain":"provi","From":"alice","To":"alice","Amount":11000000},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":500,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":500,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.delegateTokensAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":500,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":1},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Chain":"provi","Sender":"alice","UnbondFrom":"alice","Amount":1000000},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":510,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.unbondTokensAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":510,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":510,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":1},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":510,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":510,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":510,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Chain":"provi","Src":"alice","Dst":"carol","TxSender":"alice","Amount":1000000},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":510,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":510,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.redelegateTokensAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":510,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":1},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Chain":"consu","Validator":"bob"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.downtimeSlashAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":0,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":0,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":1},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":0,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":0,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Provider":"provi","Validator":"bob"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":0,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":0,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.unjailValidatorAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":0,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":1},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Chain":"provi","Validator":"carol"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.downtimeSlashAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":1},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Provider":"provi","Validator":"carol"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":495},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.unjailValidatorAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":495},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":495},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":1},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":495},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":495},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":495},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Validator":"carol","Chain":"provi"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":495},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":495},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.doublesignSlashAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":495},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":1},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Validator":"bob","Chain":"consu"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.doublesignSlashAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":1},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"}]
\ No newline at end of file
+[{"ActionType":"main.StartChainAction","Action":{"Chain":"provi","Validators":[{"Id":"bob","Allocation":10000000000,"Stake":500000000},{"Id":"alice","Allocation":10000000000,"Stake":500000000},{"Id":"carol","Allocation":10000000000,"Stake":500000000}],"GenesisChanges":"","SkipGentx":false},"State":{"provi":{"ValBalances":{"alice":9500000000,"bob":9500000000,"carol":9500000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.submitConsumerAdditionProposalAction","Action":{"Chain":"provi","From":"alice","Deposit":10000001,"ConsumerChain":"consu","SpawnTime":0,"InitialHeight":{"revision_height":1}},"State":{"provi":{"ValBalances":{"alice":9489999999,"bob":9500000000},"Proposals":{"1":{"ProposalType":"main.ConsumerAdditionProposal","Proposal":{"Deposit":10000001,"Chain":"consu","SpawnTime":0,"InitialHeight":{"revision_height":1},"Status":"PROPOSAL_STATUS_VOTING_PERIOD"}}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.assignConsumerPubKeyAction","Action":{"Chain":"consu","Validator":"carol","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is=\"}","ReconfigureNode":false,"ExpectError":false},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":{"carol":"cosmosvalcons1kswr5sq599365kcjmhgufevfps9njf43e4lwdk"},"ProviderKeys":{"carol":"cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6"},"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.assignConsumerPubKeyAction","Action":{"Chain":"consu","Validator":"carol","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is=\"}","ReconfigureNode":false,"ExpectError":true},"State":{}},{"ActionType":"main.assignConsumerPubKeyAction","Action":{"Chain":"consu","Validator":"bob","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is=\"}","ReconfigureNode":false,"ExpectError":true},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":{"bob":"","carol":"cosmosvalcons1kswr5sq599365kcjmhgufevfps9njf43e4lwdk"},"ProviderKeys":{"carol":"cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6"},"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.voteGovProposalAction","Action":{"Chain":"provi","From":["alice","bob","carol"],"Vote":["yes","yes","yes"],"PropNumber":1},"State":{"provi":{"ValBalances":{"alice":9500000000,"bob":9500000000},"Proposals":{"1":{"ProposalType":"main.ConsumerAdditionProposal","Proposal":{"Deposit":10000001,"Chain":"consu","SpawnTime":0,"InitialHeight":{"revision_height":1},"Status":"PROPOSAL_STATUS_PASSED"}}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.startConsumerChainAction","Action":{"ConsumerChain":"consu","ProviderChain":"provi","Validators":[{"Id":"bob","Allocation":10000000000,"Stake":500000000},{"Id":"alice","Allocation":10000000000,"Stake":500000000},{"Id":"carol","Allocation":10000000000,"Stake":500000000}],"GenesisChanges":".app_state.ccvconsumer.params.soft_opt_out_threshold = \"0.05\""},"State":{"consu":{"ValBalances":{"alice":10000000000,"bob":10000000000,"carol":10000000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":{"alice":9500000000,"bob":9500000000,"carol":9500000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.addIbcConnectionAction","Action":{"ChainA":"consu","ChainB":"provi","ClientA":0,"ClientB":0},"State":{}},{"ActionType":"main.addIbcChannelAction","Action":{"ChainA":"consu","ChainB":"provi","ConnectionA":0,"PortA":"consumer","PortB":"provider","Order":"ordered"},"State":{}},{"ActionType":"main.submitConsumerAdditionProposalAction","Action":{"Chain":"provi","From":"alice","Deposit":10000001,"ConsumerChain":"densu","SpawnTime":0,"InitialHeight":{"revision_height":1}},"State":{"provi":{"ValBalances":{"alice":9489999999,"bob":9500000000},"Proposals":{"2":{"ProposalType":"main.ConsumerAdditionProposal","Proposal":{"Deposit":10000001,"Chain":"densu","SpawnTime":0,"InitialHeight":{"revision_height":1},"Status":"PROPOSAL_STATUS_VOTING_PERIOD"}}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.assignConsumerPubKeyAction","Action":{"Chain":"densu","Validator":"carol","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is=\"}","ReconfigureNode":false,"ExpectError":false},"State":{"densu":{"ValBalances":null,"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":{"carol":"cosmosvalcons1kswr5sq599365kcjmhgufevfps9njf43e4lwdk"},"ProviderKeys":{"carol":"cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6"},"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.assignConsumerPubKeyAction","Action":{"Chain":"densu","Validator":"carol","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is=\"}","ReconfigureNode":false,"ExpectError":true},"State":{}},{"ActionType":"main.assignConsumerPubKeyAction","Action":{"Chain":"densu","Validator":"bob","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is=\"}","ReconfigureNode":false,"ExpectError":true},"State":{"densu":{"ValBalances":null,"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":{"bob":"","carol":"cosmosvalcons1kswr5sq599365kcjmhgufevfps9njf43e4lwdk"},"ProviderKeys":{"carol":"cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6"},"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.voteGovProposalAction","Action":{"Chain":"provi","From":["alice","bob","carol"],"Vote":["yes","yes","yes"],"PropNumber":2},"State":{"provi":{"ValBalances":{"alice":9500000000,"bob":9500000000},"Proposals":{"2":{"ProposalType":"main.ConsumerAdditionProposal","Proposal":{"Deposit":10000001,"Chain":"densu","SpawnTime":0,"InitialHeight":{"revision_height":1},"Status":"PROPOSAL_STATUS_PASSED"}}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.startConsumerChainAction","Action":{"ConsumerChain":"densu","ProviderChain":"provi","Validators":[{"Id":"bob","Allocation":10000000000,"Stake":500000000},{"Id":"alice","Allocation":10000000000,"Stake":500000000},{"Id":"carol","Allocation":10000000000,"Stake":500000000}],"GenesisChanges":".app_state.ccvconsumer.params.soft_opt_out_threshold = \"0.05\""},"State":{"densu":{"ValBalances":{"alice":10000000000,"bob":10000000000,"carol":10000000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":{"alice":9500000000,"bob":9500000000,"carol":9500000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.addIbcConnectionAction","Action":{"ChainA":"densu","ChainB":"provi","ClientA":0,"ClientB":1},"State":{}},{"ActionType":"main.addIbcChannelAction","Action":{"ChainA":"densu","ChainB":"provi","ConnectionA":0,"PortA":"consumer","PortB":"provider","Order":"ordered"},"State":{}},{"ActionType":"main.delegateTokensAction","Action":{"Chain":"provi","From":"alice","To":"alice","Amount":11000000},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":500,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":500,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":500,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":1},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.unbondTokensAction","Action":{"Chain":"provi","Sender":"alice","UnbondFrom":"alice","Amount":1000000},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":510,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":510,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":510,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":1},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":510,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":510,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":510,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.redelegateTokensAction","Action":{"Chain":"provi","Src":"alice","Dst":"carol","TxSender":"alice","Amount":1000000},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":510,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":510,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":510,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":1},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.downtimeSlashAction","Action":{"Chain":"consu","Validator":"bob"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":0,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":0,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":1},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":0,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":0,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.unjailValidatorAction","Action":{"Provider":"provi","Validator":"bob"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":0,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":0,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":0,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":1},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.downtimeSlashAction","Action":{"Chain":"provi","Validator":"carol"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":501},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":1},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.unjailValidatorAction","Action":{"Provider":"provi","Validator":"carol"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":495},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":495},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":495},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":1},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":495},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":495},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":495},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.doublesignSlashAction","Action":{"Validator":"carol","Chain":"provi"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":495},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":495},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":495},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":1},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.doublesignSlashAction","Action":{"Validator":"bob","Chain":"consu"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":1},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"densu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":509,"bob":500,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}}]
\ No newline at end of file
diff --git a/tests/e2e/tracehandler_testdata/slashThrottleSteps.json b/tests/e2e/tracehandler_testdata/slashThrottleSteps.json
index 897317edc9..c06c4b4bb6 100644
--- a/tests/e2e/tracehandler_testdata/slashThrottleSteps.json
+++ b/tests/e2e/tracehandler_testdata/slashThrottleSteps.json
@@ -1 +1 @@
-[{"Action":{"Chain":"provi","Validators":[{"Id":"bob","Allocation":10000000000,"Stake":500000000},{"Id":"alice","Allocation":10000000000,"Stake":500000000},{"Id":"carol","Allocation":10000000000,"Stake":500000000}],"GenesisChanges":"","SkipGentx":false},"State":{"provi":{"ValBalances":{"alice":9500000000,"bob":9500000000,"carol":9500000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.StartChainAction"},{"Action":{"Chain":"provi","From":"alice","Deposit":10000001,"ConsumerChain":"consu","SpawnTime":0,"InitialHeight":{"revision_height":1}},"State":{"provi":{"ValBalances":{"alice":9489999999,"bob":9500000000},"Proposals":{"1":{"Deposit":10000001,"Chain":"consu","SpawnTime":0,"InitialHeight":{"revision_height":1},"Status":"PROPOSAL_STATUS_VOTING_PERIOD"}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.submitConsumerAdditionProposalAction"},{"Action":{"Chain":"consu","Validator":"carol","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is=\"}","ReconfigureNode":false,"ExpectError":false},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":{"carol":"cosmosvalcons1kswr5sq599365kcjmhgufevfps9njf43e4lwdk"},"ProviderKeys":{"carol":"cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6"},"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.assignConsumerPubKeyAction"},{"Action":{"Chain":"consu","Validator":"carol","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is=\"}","ReconfigureNode":false,"ExpectError":true},"State":{},"ActionType":"main.assignConsumerPubKeyAction"},{"Action":{"Chain":"consu","Validator":"bob","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is=\"}","ReconfigureNode":false,"ExpectError":true},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":{"bob":"","carol":"cosmosvalcons1kswr5sq599365kcjmhgufevfps9njf43e4lwdk"},"ProviderKeys":{"carol":"cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6"},"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.assignConsumerPubKeyAction"},{"Action":{"Chain":"provi","From":["alice","bob","carol"],"Vote":["yes","yes","yes"],"PropNumber":1},"State":{"provi":{"ValBalances":{"alice":9500000000,"bob":9500000000},"Proposals":{"1":{"Deposit":10000001,"Chain":"consu","SpawnTime":0,"InitialHeight":{"revision_height":1},"Status":"PROPOSAL_STATUS_PASSED"}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.voteGovProposalAction"},{"Action":{},"State":{"consu":{"ValBalances":{"alice":10000000000,"bob":10000000000,"carol":10000000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":{"alice":9500000000,"bob":9500000000,"carol":9500000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.startConsumerChainAction"},{"Action":{"ChainA":"consu","ChainB":"provi","ClientA":0,"ClientB":0},"State":{},"ActionType":"main.addIbcConnectionAction"},{"Action":{"ChainA":"consu","ChainB":"provi","ConnectionA":0,"PortA":"consumer","PortB":"provider","Order":"ordered"},"State":{},"ActionType":"main.addIbcChannelAction"},{"Action":{"Chain":"provi","From":"alice","To":"alice","Amount":11000000},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":500,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.delegateTokensAction"},{"Action":{"Chain":"consu","From":"alice","To":"bob","Amount":1},"State":{"consu":{"ValBalances":{"alice":10000000000,"bob":10000000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.SendTokensAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.relayPacketsAction"},{"Action":{"Chain":"consu","From":"alice","To":"bob","Amount":1},"State":{"consu":{"ValBalances":{"alice":9999999999,"bob":10000000001},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.SendTokensAction"},{"Action":{"Chain":"consu","Validator":"bob"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.downtimeSlashAction"},{"Action":{"Chain":"consu","Validator":"carol"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.downtimeSlashAction"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":0,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":{"consu":1},"GlobalSlashQueueSize":1}},"ActionType":"main.relayPacketsAction"},{"Action":{"Chain":"consu","CurrentQueueSize":1,"NextQueueSize":0,"Timeout":80000000000},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":0,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":{"consu":0},"GlobalSlashQueueSize":0}},"ActionType":"main.slashThrottleDequeue"},{"Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":0,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":0,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":{"consu":0},"GlobalSlashQueueSize":0}},"ActionType":"main.relayPacketsAction"},{"Action":{"Chain":"provi","From":"bob","Deposit":10000001,"ConsumerChain":"consu","StopTimeOffset":0},"State":{"provi":{"ValBalances":{"bob":9489999999},"Proposals":{"2":{"Deposit":10000001,"Chain":"consu","StopTime":0,"Status":"PROPOSAL_STATUS_VOTING_PERIOD"}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":{"consu":true},"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.submitConsumerRemovalProposalAction"},{"Action":{"Chain":"provi","From":["alice","bob","carol"],"Vote":["yes","yes","yes"],"PropNumber":2},"State":{"provi":{"ValBalances":{"bob":9500000000},"Proposals":{"2":{"Deposit":10000001,"Chain":"consu","StopTime":0,"Status":"PROPOSAL_STATUS_PASSED"}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":{},"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.voteGovProposalAction"}]
\ No newline at end of file
+[{"ActionType":"main.StartChainAction","Action":{"Chain":"provi","Validators":[{"Id":"bob","Allocation":10000000000,"Stake":500000000},{"Id":"alice","Allocation":10000000000,"Stake":500000000},{"Id":"carol","Allocation":10000000000,"Stake":500000000}],"GenesisChanges":"","SkipGentx":false},"State":{"provi":{"ValBalances":{"alice":9500000000,"bob":9500000000,"carol":9500000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.submitConsumerAdditionProposalAction","Action":{"Chain":"provi","From":"alice","Deposit":10000001,"ConsumerChain":"consu","SpawnTime":0,"InitialHeight":{"revision_height":1}},"State":{"provi":{"ValBalances":{"alice":9489999999,"bob":9500000000},"Proposals":{"1":{"ProposalType":"main.ConsumerAdditionProposal","Proposal":{"Deposit":10000001,"Chain":"consu","SpawnTime":0,"InitialHeight":{"revision_height":1},"Status":"PROPOSAL_STATUS_VOTING_PERIOD"}}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.assignConsumerPubKeyAction","Action":{"Chain":"consu","Validator":"carol","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is=\"}","ReconfigureNode":false,"ExpectError":false},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":{"carol":"cosmosvalcons1kswr5sq599365kcjmhgufevfps9njf43e4lwdk"},"ProviderKeys":{"carol":"cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6"},"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.assignConsumerPubKeyAction","Action":{"Chain":"consu","Validator":"carol","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is=\"}","ReconfigureNode":false,"ExpectError":true},"State":{}},{"ActionType":"main.assignConsumerPubKeyAction","Action":{"Chain":"consu","Validator":"bob","ConsumerPubkey":"{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is=\"}","ReconfigureNode":false,"ExpectError":true},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":{"bob":"","carol":"cosmosvalcons1kswr5sq599365kcjmhgufevfps9njf43e4lwdk"},"ProviderKeys":{"carol":"cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6"},"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.voteGovProposalAction","Action":{"Chain":"provi","From":["alice","bob","carol"],"Vote":["yes","yes","yes"],"PropNumber":1},"State":{"provi":{"ValBalances":{"alice":9500000000,"bob":9500000000},"Proposals":{"1":{"ProposalType":"main.ConsumerAdditionProposal","Proposal":{"Deposit":10000001,"Chain":"consu","SpawnTime":0,"InitialHeight":{"revision_height":1},"Status":"PROPOSAL_STATUS_PASSED"}}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.startConsumerChainAction","Action":{"ConsumerChain":"consu","ProviderChain":"provi","Validators":[{"Id":"bob","Allocation":10000000000,"Stake":500000000},{"Id":"alice","Allocation":10000000000,"Stake":500000000},{"Id":"carol","Allocation":10000000000,"Stake":500000000}],"GenesisChanges":".app_state.ccvconsumer.params.soft_opt_out_threshold = \"0.05\""},"State":{"consu":{"ValBalances":{"alice":10000000000,"bob":10000000000,"carol":10000000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":{"alice":9500000000,"bob":9500000000,"carol":9500000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.addIbcConnectionAction","Action":{"ChainA":"consu","ChainB":"provi","ClientA":0,"ClientB":0},"State":{}},{"ActionType":"main.addIbcChannelAction","Action":{"ChainA":"consu","ChainB":"provi","ConnectionA":0,"PortA":"consumer","PortB":"provider","Order":"ordered"},"State":{}},{"ActionType":"main.delegateTokensAction","Action":{"Chain":"provi","From":"alice","To":"alice","Amount":11000000},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":500,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.SendTokensAction","Action":{"Chain":"consu","From":"alice","To":"bob","Amount":1},"State":{"consu":{"ValBalances":{"alice":10000000000,"bob":10000000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.SendTokensAction","Action":{"Chain":"consu","From":"alice","To":"bob","Amount":1},"State":{"consu":{"ValBalances":{"alice":9999999999,"bob":10000000001},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.downtimeSlashAction","Action":{"Chain":"consu","Validator":"bob"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.downtimeSlashAction","Action":{"Chain":"consu","Validator":"carol"},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":0,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":{"consu":1},"GlobalSlashQueueSize":1}}},{"ActionType":"main.slashThrottleDequeue","Action":{"Chain":"consu","CurrentQueueSize":1,"NextQueueSize":0,"Timeout":80000000000},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":500,"carol":500},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":0,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":{"consu":0},"GlobalSlashQueueSize":0}}},{"ActionType":"main.relayPacketsAction","Action":{"Chain":"provi","Port":"provider","Channel":0},"State":{"consu":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":0,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null},"provi":{"ValBalances":null,"Proposals":null,"ValPowers":{"alice":511,"bob":0,"carol":0},"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":{"consu":0},"GlobalSlashQueueSize":0}}},{"ActionType":"main.submitConsumerRemovalProposalAction","Action":{"Chain":"provi","From":"bob","Deposit":10000001,"ConsumerChain":"consu","StopTimeOffset":0},"State":{"provi":{"ValBalances":{"bob":9489999999},"Proposals":{"2":{"ProposalType":"main.ConsumerRemovalProposal","Proposal":{"Deposit":10000001,"Chain":"consu","StopTime":0,"Status":"PROPOSAL_STATUS_VOTING_PERIOD"}}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":{"consu":true},"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}},{"ActionType":"main.voteGovProposalAction","Action":{"Chain":"provi","From":["alice","bob","carol"],"Vote":["yes","yes","yes"],"PropNumber":2},"State":{"provi":{"ValBalances":{"bob":9500000000},"Proposals":{"2":{"ProposalType":"main.ConsumerRemovalProposal","Proposal":{"Deposit":10000001,"Chain":"consu","StopTime":0,"Status":"PROPOSAL_STATUS_PASSED"}}},"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":{},"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}}]
\ No newline at end of file
diff --git a/tests/e2e/tracehandler_testdata/start_provider_chain.json b/tests/e2e/tracehandler_testdata/start_provider_chain.json
index 739fee624e..28114df15f 100644
--- a/tests/e2e/tracehandler_testdata/start_provider_chain.json
+++ b/tests/e2e/tracehandler_testdata/start_provider_chain.json
@@ -1 +1 @@
-[{"Action":{"Chain":"provi","Validators":[{"Id":"bob","Allocation":10000000000,"Stake":500000000},{"Id":"alice","Allocation":10000000000,"Stake":500000000},{"Id":"carol","Allocation":10000000000,"Stake":500000000}],"GenesisChanges":"","SkipGentx":false},"State":{"provi":{"ValBalances":{"alice":9500000000,"bob":9500000000,"carol":9500000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}},"ActionType":"main.StartChainAction"}]
\ No newline at end of file
+[{"ActionType":"main.StartChainAction","Action":{"Chain":"provi","Validators":[{"Id":"bob","Allocation":10000000000,"Stake":500000000},{"Id":"alice","Allocation":10000000000,"Stake":500000000},{"Id":"carol","Allocation":10000000000,"Stake":500000000}],"GenesisChanges":"","SkipGentx":false},"State":{"provi":{"ValBalances":{"alice":9500000000,"bob":9500000000,"carol":9500000000},"Proposals":null,"ValPowers":null,"RepresentativePowers":null,"Params":null,"Rewards":null,"ConsumerChains":null,"AssignedKeys":null,"ProviderKeys":null,"ConsumerChainQueueSizes":null,"GlobalSlashQueueSize":null}}}]
\ No newline at end of file
From 1fc70d745f440e4c6b086d25a147ef7ca534462d Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Thu, 27 Apr 2023 12:26:52 +0200
Subject: [PATCH 18/35] Chore: Export forgotten field
---
tests/e2e/actions.go | 18 +++++++++---------
tests/e2e/steps_democracy.go | 8 ++++----
2 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/tests/e2e/actions.go b/tests/e2e/actions.go
index d32b92ff96..561738eb50 100644
--- a/tests/e2e/actions.go
+++ b/tests/e2e/actions.go
@@ -867,24 +867,24 @@ func (tr TestRun) relayPackets(
}
type relayRewardPacketsToProviderAction struct {
- consumerChain ChainID
- providerChain ChainID
- port string
- channel uint
+ ConsumerChain ChainID
+ ProviderChain ChainID
+ Port string
+ Channel uint
}
func (tr TestRun) relayRewardPacketsToProvider(
action relayRewardPacketsToProviderAction,
verbose bool,
) {
- blockPerDistribution, _ := strconv.ParseUint(strings.Trim(tr.getParam(action.consumerChain, Param{Subspace: "ccvconsumer", Key: "BlocksPerDistributionTransmission"}), "\""), 10, 64)
- currentBlock := uint64(tr.getBlockHeight(action.consumerChain))
+ blockPerDistribution, _ := strconv.ParseUint(strings.Trim(tr.getParam(action.ConsumerChain, Param{Subspace: "ccvconsumer", Key: "BlocksPerDistributionTransmission"}), "\""), 10, 64)
+ currentBlock := uint64(tr.getBlockHeight(action.ConsumerChain))
if currentBlock <= blockPerDistribution {
- tr.waitBlocks(action.consumerChain, uint(blockPerDistribution-currentBlock+1), 60*time.Second)
+ tr.waitBlocks(action.ConsumerChain, uint(blockPerDistribution-currentBlock+1), 60*time.Second)
}
- tr.relayPackets(relayPacketsAction{Chain: action.consumerChain, Port: action.port, Channel: action.channel}, verbose)
- tr.waitBlocks(action.providerChain, 1, 10*time.Second)
+ tr.relayPackets(relayPacketsAction{Chain: action.ConsumerChain, Port: action.Port, Channel: action.Channel}, verbose)
+ tr.waitBlocks(action.ProviderChain, 1, 10*time.Second)
}
type delegateTokensAction struct {
diff --git a/tests/e2e/steps_democracy.go b/tests/e2e/steps_democracy.go
index 8c282f02fa..2f10f416f5 100644
--- a/tests/e2e/steps_democracy.go
+++ b/tests/e2e/steps_democracy.go
@@ -107,10 +107,10 @@ func stepsDemocracy(consumerName string) []Step {
},
{
Action: relayRewardPacketsToProviderAction{
- consumerChain: ChainID(consumerName),
- providerChain: ChainID("provi"),
- port: "transfer",
- channel: 1,
+ ConsumerChain: ChainID(consumerName),
+ ProviderChain: ChainID("provi"),
+ Port: "transfer",
+ Channel: 1,
},
State: State{
ChainID("provi"): ChainState{
From cf5f0d99b90e5d67b77a9b6a497509d437034f79 Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Thu, 27 Apr 2023 12:30:24 +0200
Subject: [PATCH 19/35] Use string, not int, to help marshal/unmarshal
---
tests/e2e/steps_democracy.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/e2e/steps_democracy.go b/tests/e2e/steps_democracy.go
index 2f10f416f5..9e0d2cfaeb 100644
--- a/tests/e2e/steps_democracy.go
+++ b/tests/e2e/steps_democracy.go
@@ -66,7 +66,7 @@ func stepsDemocracy(consumerName string) []Step {
Deposit: 10000001,
Subspace: "staking",
Key: "MaxValidators",
- Value: 105,
+ Value: "105",
},
State: State{
ChainID(consumerName): ChainState{
From a1e873c4cdd633c42fd18efbc7d1f00ef978b004 Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Tue, 2 May 2023 10:49:59 +0200
Subject: [PATCH 20/35] Add rapid to go.mod and .sum
---
go.mod | 6 ++++--
go.sum | 3 +++
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/go.mod b/go.mod
index 2e0f10e431..83f2b15d15 100644
--- a/go.mod
+++ b/go.mod
@@ -83,8 +83,8 @@ require (
github.com/golang/glog v1.0.0 // indirect
github.com/golang/snappy v0.0.4 // indirect
github.com/google/btree v1.1.2 // indirect
- github.com/google/gofuzz v1.2.0 // indirect
github.com/google/go-cmp v0.5.9
+ github.com/google/gofuzz v1.2.0 // indirect
github.com/google/orderedcode v0.0.1 // indirect
github.com/gorilla/handlers v1.5.1 // indirect
github.com/gorilla/websocket v1.5.0 // indirect
@@ -110,9 +110,9 @@ require (
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.16 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
- github.com/mitchellh/mapstructure v1.5.0
github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect
github.com/minio/highwayhash v1.0.2 // indirect
+ github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/mtibben/percent v0.2.1 // indirect
github.com/onsi/ginkgo v1.16.4 // indirect
github.com/onsi/gomega v1.20.0 // indirect
@@ -151,6 +151,8 @@ require (
nhooyr.io/websocket v1.8.6 // indirect
)
+require pgregory.net/rapid v0.5.7
+
replace (
github.com/cosmos/cosmos-sdk => github.com/cosmos/cosmos-sdk v0.45.15-ics
github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1
diff --git a/go.sum b/go.sum
index 9dd57f7d46..747f9f42e7 100644
--- a/go.sum
+++ b/go.sum
@@ -1537,6 +1537,9 @@ honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=
nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k=
nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0=
pgregory.net/rapid v0.5.3 h1:163N50IHFqr1phZens4FQOdPgfJscR7a562mjQqeo4M=
+pgregory.net/rapid v0.5.3/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04=
+pgregory.net/rapid v0.5.7 h1:p7/XbOgyFY1I/3Q12UTXfos70VZTcgc3WeoyiEru5cs=
+pgregory.net/rapid v0.5.7/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
From 3588cfac66c8046a96051fa6b855ee59e2be55d2 Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Tue, 2 May 2023 10:50:20 +0200
Subject: [PATCH 21/35] Add rapidpbt for chainState marshalling
---
tests/e2e/trace_handler_rapid_test.go | 226 ++++++++++++++++++++++++++
tests/e2e/trace_handlers_test.go | 36 ++--
2 files changed, 249 insertions(+), 13 deletions(-)
create mode 100644 tests/e2e/trace_handler_rapid_test.go
diff --git a/tests/e2e/trace_handler_rapid_test.go b/tests/e2e/trace_handler_rapid_test.go
new file mode 100644
index 0000000000..5130cc605f
--- /dev/null
+++ b/tests/e2e/trace_handler_rapid_test.go
@@ -0,0 +1,226 @@
+package main
+
+import (
+ "testing"
+
+ clienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types"
+ "pgregory.net/rapid"
+)
+
+func TestChainStateMarshalling(t *testing.T) {
+ rapid.Check(t, func(t *rapid.T) {
+ chainState := GetChainStateGen().Draw(t, "ChainState")
+ err := MarshalAndUnmarshalChainState(chainState)
+ if err != nil {
+ t.Fatalf("error marshalling and unmarshalling chain state: %v", err)
+ }
+ })
+}
+
+func GetChainStateGen() *rapid.Generator[ChainState] {
+ return rapid.Custom(
+ func(t *rapid.T) ChainState {
+ valBalances := GetValBalancesGen().Draw(t, "ValBalances")
+ proposals := GetProposalsGen().Draw(t, "Proposals")
+ valPowers := GetValPowersGen().Draw(t, "ValPowers")
+ representativePowers := GetRepresentativePowersGen().Draw(t, "RepresentativePowers")
+ params := GetParamsGen().Draw(t, "Params")
+ rewards := GetRewardsGen().Draw(t, "Rewards")
+ consumerChains := GetConsumerChainsGen().Draw(t, "ConsumerChains")
+ assignedKeys := GetAssignedKeysGen().Draw(t, "AssignedKeys")
+ providerKeys := GetProviderKeysGen().Draw(t, "ProviderKeys")
+ consumerChainQueueSizes := GetConsumerChainQueueSizesGen().Draw(t, "ConsumerChainQueueSizes")
+ globalSlashQueueSize := rapid.Uint().Draw(t, "GlobalSlashQueueSize")
+
+ return ChainState{
+ ValBalances: &valBalances,
+ Proposals: &proposals,
+ ValPowers: &valPowers,
+ RepresentativePowers: &representativePowers,
+ Params: ¶ms,
+ Rewards: &rewards,
+ ConsumerChains: &consumerChains,
+ AssignedKeys: &assignedKeys,
+ ProviderKeys: &providerKeys,
+ ConsumerChainQueueSizes: &consumerChainQueueSizes,
+ GlobalSlashQueueSize: &globalSlashQueueSize,
+ }
+ })
+}
+
+func GetConsumerChainQueueSizesGen() *rapid.Generator[map[ChainID]uint] {
+ return rapid.Custom(func(t *rapid.T) map[ChainID]uint {
+ return rapid.MapOf(GetChainIDGen(), rapid.Uint()).Draw(t, "ConsumerChainQueueSizes")
+ })
+}
+
+func GetProviderKeysGen() *rapid.Generator[map[ValidatorID]string] {
+ return rapid.Custom(func(t *rapid.T) map[ValidatorID]string {
+ return rapid.MapOf(GetValidatorIDGen(), rapid.String()).Draw(t, "ProviderKeys")
+ })
+}
+
+func GetAssignedKeysGen() *rapid.Generator[map[ValidatorID]string] {
+ return rapid.Custom(func(t *rapid.T) map[ValidatorID]string {
+ return rapid.MapOf(GetValidatorIDGen(), rapid.String()).Draw(t, "AssignedKeys")
+ })
+}
+
+func GetChainIDGen() *rapid.Generator[ChainID] {
+ return rapid.Custom(func(t *rapid.T) ChainID {
+ return ChainID(rapid.String().Draw(t, "ChainID"))
+ })
+}
+
+func GetConsumerChainsGen() *rapid.Generator[map[ChainID]bool] {
+ return rapid.Custom(func(t *rapid.T) map[ChainID]bool {
+ return rapid.MapOf(GetChainIDGen(), rapid.Bool()).Draw(t, "ConsumerChains")
+ })
+}
+
+func GetRewardsGen() *rapid.Generator[Rewards] {
+ return rapid.Custom(func(t *rapid.T) Rewards {
+ return Rewards{
+ IsIncrementalReward: rapid.Bool().Draw(t, "IsIncrementalReward"),
+ IsNativeDenom: rapid.Bool().Draw(t, "IsNativeDenom"),
+ IsRewarded: rapid.MapOf(GetValidatorIDGen(), rapid.Bool()).Draw(t, "IsRewarded"),
+ }
+ })
+}
+
+func GetParamsGen() *rapid.Generator[[]Param] {
+ return rapid.Custom(func(t *rapid.T) []Param {
+ return rapid.SliceOf(GetParamGen()).Draw(t, "Params")
+ })
+}
+
+func GetParamGen() *rapid.Generator[Param] {
+ return rapid.Custom(func(t *rapid.T) Param {
+ return Param{
+ Key: rapid.String().Draw(t, "Key"),
+ Value: rapid.String().Draw(t, "Value"),
+ }
+ })
+}
+
+func GetRepresentativePowersGen() *rapid.Generator[map[ValidatorID]uint] {
+ return rapid.Custom(func(t *rapid.T) map[ValidatorID]uint {
+ return rapid.MapOf(
+ GetValidatorIDGen(),
+ rapid.Uint(),
+ ).Draw(t, "RepresentativePowers")
+ })
+}
+
+func GetValPowersGen() *rapid.Generator[map[ValidatorID]uint] {
+ return rapid.Custom(func(t *rapid.T) map[ValidatorID]uint {
+ return rapid.MapOf(
+ GetValidatorIDGen(),
+ rapid.Uint(),
+ ).Draw(t, "ValPowers")
+ })
+}
+
+func GetValBalancesGen() *rapid.Generator[map[ValidatorID]uint] {
+ return rapid.Custom(func(t *rapid.T) map[ValidatorID]uint {
+ return rapid.MapOf(
+ GetValidatorIDGen(),
+ rapid.Uint(),
+ ).Draw(t, "ValBalances")
+ })
+}
+
+func GetValidatorIDGen() *rapid.Generator[ValidatorID] {
+ return rapid.Custom(func(t *rapid.T) ValidatorID {
+ return ValidatorID(rapid.String().Draw(t, "ValidatorID"))
+ })
+}
+
+func GetProposalsGen() *rapid.Generator[map[uint]Proposal] {
+ return rapid.Custom(func(t *rapid.T) map[uint]Proposal {
+ return rapid.MapOf(
+ rapid.Uint(),
+ GetProposalGen(),
+ ).Draw(t, "Proposals")
+ })
+}
+
+func GetProposalGen() *rapid.Generator[Proposal] {
+ return rapid.Custom(func(t *rapid.T) Proposal {
+ gen := rapid.OneOf(
+ GetConsumerAdditionProposalGen().AsAny(),
+ GetConsumerRemovalProposalGen().AsAny(),
+ GetEquivocationProposalGen().AsAny(),
+ GetTextProposalGen().AsAny(),
+ GetParamsProposalGen().AsAny(),
+ )
+ return gen.Draw(t, "Proposal").(Proposal)
+ })
+}
+
+func GetConsumerAdditionProposalGen() *rapid.Generator[ConsumerAdditionProposal] {
+ return rapid.Custom(func(t *rapid.T) ConsumerAdditionProposal {
+ return ConsumerAdditionProposal{
+ Deposit: rapid.Uint().Draw(t, "Deposit"),
+ Chain: GetChainIDGen().Draw(t, "Chain"),
+ SpawnTime: rapid.Int().Draw(t, "SpawnTime"),
+ InitialHeight: GetHeightGen().Draw(t, "InitialHeight"),
+ Status: rapid.String().Draw(t, "Status"),
+ }
+ })
+}
+
+func GetConsumerRemovalProposalGen() *rapid.Generator[ConsumerRemovalProposal] {
+ return rapid.Custom(func(t *rapid.T) ConsumerRemovalProposal {
+ return ConsumerRemovalProposal{
+ Deposit: rapid.Uint().Draw(t, "Deposit"),
+ Chain: GetChainIDGen().Draw(t, "Chain"),
+ StopTime: rapid.Int().Draw(t, "StopTime"),
+ Status: rapid.String().Draw(t, "Status"),
+ }
+ })
+}
+
+func GetEquivocationProposalGen() *rapid.Generator[EquivocationProposal] {
+ return rapid.Custom(func(t *rapid.T) EquivocationProposal {
+ return EquivocationProposal{
+ Power: rapid.Uint().Draw(t, "Power"),
+ Height: rapid.Uint().Draw(t, "Height"),
+ ConsensusAddress: rapid.String().Draw(t, "ConesnsuAddress"),
+ Deposit: rapid.Uint().Draw(t, "Deposit"),
+ Status: rapid.String().Draw(t, "Status"),
+ }
+ })
+}
+
+func GetTextProposalGen() *rapid.Generator[TextProposal] {
+ return rapid.Custom(func(t *rapid.T) TextProposal {
+ return TextProposal{
+ Title: rapid.String().Draw(t, "Title"),
+ Description: rapid.String().Draw(t, "Description"),
+ Deposit: rapid.Uint().Draw(t, "Deposit"),
+ Status: rapid.String().Draw(t, "Status"),
+ }
+ })
+}
+
+func GetParamsProposalGen() *rapid.Generator[ParamsProposal] {
+ return rapid.Custom(func(t *rapid.T) ParamsProposal {
+ return ParamsProposal{
+ Subspace: rapid.String().Draw(t, "Subspace"),
+ Key: rapid.String().Draw(t, "Key"),
+ Value: rapid.String().Draw(t, "Value"),
+ Deposit: rapid.Uint().Draw(t, "Deposit"),
+ Status: rapid.String().Draw(t, "Status"),
+ }
+ })
+}
+
+func GetHeightGen() *rapid.Generator[clienttypes.Height] {
+ return rapid.Custom(func(t *rapid.T) clienttypes.Height {
+ return clienttypes.Height{
+ RevisionNumber: rapid.Uint64().Draw(t, "RevisionNumber"),
+ RevisionHeight: rapid.Uint64().Draw(t, "RevisionHeight"),
+ }
+ })
+}
diff --git a/tests/e2e/trace_handlers_test.go b/tests/e2e/trace_handlers_test.go
index ccebc22484..8b48ae7c5e 100644
--- a/tests/e2e/trace_handlers_test.go
+++ b/tests/e2e/trace_handlers_test.go
@@ -2,6 +2,7 @@ package main
import (
"encoding/json"
+ "fmt"
"log"
"os"
"path/filepath"
@@ -165,22 +166,31 @@ func TestMarshalAndUnmarshalChainState(t *testing.T) {
for name, tc := range tests {
t.Run(name, func(t *testing.T) {
- jsonobj, err := json.Marshal(tc.chainState)
+ err := MarshalAndUnmarshalChainState(tc.chainState)
if err != nil {
- t.Fatalf("error marshalling chain state: %v", err)
+ t.Fatalf(err.Error())
}
+ })
+ }
+}
- var got *ChainState
- err = json.Unmarshal(jsonobj, &got)
- if err != nil {
- t.Fatalf("error unmarshalling chain state: %v", err)
- }
+func MarshalAndUnmarshalChainState(chainState ChainState) error {
+ jsonobj, err := json.Marshal(chainState)
+ if err != nil {
+ return fmt.Errorf("error marshalling chain state: %v", err)
+ }
- diff := cmp.Diff(tc.chainState, *got)
- if diff != "" {
- log.Print(string(jsonobj))
- t.Fatalf(diff)
- }
- })
+ var got *ChainState
+ err = json.Unmarshal(jsonobj, &got)
+ if err != nil {
+ return fmt.Errorf("error unmarshalling chain state: %v", err)
}
+
+ diff := cmp.Diff(chainState, *got)
+ if diff != "" {
+ log.Print(string(jsonobj))
+ return fmt.Errorf(diff)
+ }
+
+ return nil
}
From 32bd59c2286cd2818824f7c1d5186789e67d891f Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Tue, 2 May 2023 10:52:01 +0200
Subject: [PATCH 22/35] Rename file to make clear it only relates to chainState
---
.../e2e/{trace_handler_rapid_test.go => chainState_rapid_test.go} | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename tests/e2e/{trace_handler_rapid_test.go => chainState_rapid_test.go} (100%)
diff --git a/tests/e2e/trace_handler_rapid_test.go b/tests/e2e/chainState_rapid_test.go
similarity index 100%
rename from tests/e2e/trace_handler_rapid_test.go
rename to tests/e2e/chainState_rapid_test.go
From 478d2862a4eb33c0e877d13bae2d188c6221148f Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Tue, 2 May 2023 16:13:12 +0200
Subject: [PATCH 23/35] Add error return to TraceWriter and TraceParser
---
tests/e2e/json_parser.go | 2 +-
tests/e2e/json_writer.go | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/tests/e2e/json_parser.go b/tests/e2e/json_parser.go
index b4ca98717a..86f79a35f7 100644
--- a/tests/e2e/json_parser.go
+++ b/tests/e2e/json_parser.go
@@ -7,7 +7,7 @@ import (
// TraceParser provides an interface for parsers that read sequences of Steps from files.
type TraceParser interface {
- ReadTraceFromFile(filepath string) []Step
+ ReadTraceFromFile(filepath string) ([]Step, error)
}
// JSONParser is a simple parser that reads steps by unmarshalling from a file.
diff --git a/tests/e2e/json_writer.go b/tests/e2e/json_writer.go
index e559c7a1ff..e237b6f0f6 100644
--- a/tests/e2e/json_writer.go
+++ b/tests/e2e/json_writer.go
@@ -7,7 +7,7 @@ import (
// TraceWriter is an interface for writers that write steps to files.
type TraceWriter interface {
- WriteTraceToFile(filepath string, trace []Step)
+ WriteTraceToFile(filepath string, trace []Step) error
}
// JSONWriter is a simple writer that simply marshals the array of Step objects.
From 16f90c1b15f81cd556c6a28a8e47c6aa0e2a622e Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Wed, 3 May 2023 07:48:08 +0200
Subject: [PATCH 24/35] gst
---
tests/e2e/{chainState_rapid_test.go => state_rapid_test.go} | 6 ++++++
1 file changed, 6 insertions(+)
rename tests/e2e/{chainState_rapid_test.go => state_rapid_test.go} (97%)
diff --git a/tests/e2e/chainState_rapid_test.go b/tests/e2e/state_rapid_test.go
similarity index 97%
rename from tests/e2e/chainState_rapid_test.go
rename to tests/e2e/state_rapid_test.go
index 5130cc605f..158e67dd1f 100644
--- a/tests/e2e/chainState_rapid_test.go
+++ b/tests/e2e/state_rapid_test.go
@@ -17,6 +17,12 @@ func TestChainStateMarshalling(t *testing.T) {
})
}
+func GetStateGen() *rapid.Generator[State] {
+ return rapid.Custom(func(t *rapid.T) State {
+ return rapid.MapOf(GetChainIDGen(), GetChainStateGen()).Draw(t, "State")
+ })
+}
+
func GetChainStateGen() *rapid.Generator[ChainState] {
return rapid.Custom(
func(t *rapid.T) ChainState {
From 653af8de22ef253e1767cf45218fbbf48c2bdcd3 Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Wed, 3 May 2023 07:49:06 +0200
Subject: [PATCH 25/35] Add generators for actions and steps, utilize in test
driver
---
tests/e2e/action_rapid_test.go | 334 +++++++++++++++++++++++++++++++
tests/e2e/step_rapid_test.go | 43 ++++
tests/e2e/trace_handlers_test.go | 35 ++--
3 files changed, 399 insertions(+), 13 deletions(-)
create mode 100644 tests/e2e/action_rapid_test.go
create mode 100644 tests/e2e/step_rapid_test.go
diff --git a/tests/e2e/action_rapid_test.go b/tests/e2e/action_rapid_test.go
new file mode 100644
index 0000000000..92dba9e879
--- /dev/null
+++ b/tests/e2e/action_rapid_test.go
@@ -0,0 +1,334 @@
+package main
+
+import (
+ "time"
+
+ "pgregory.net/rapid"
+)
+
+func GetActionGen() *rapid.Generator[any] {
+ return rapid.OneOf(
+ GetSendTokensActionGen().AsAny(),
+ GetStartChainActionGen().AsAny(),
+ GetSubmitTextProposalActionGen().AsAny(),
+ GetSubmitConsumerAdditionProposalActionGen().AsAny(),
+ GetSubmitConsumerRemovalProposalActionGen().AsAny(),
+ GetSubmitParamChangeProposalActionGen().AsAny(),
+ GetSubmitEquivocationProposalActionGen().AsAny(),
+ GetVoteGovProposalActionGen().AsAny(),
+ GetStartConsumerChainActionGen().AsAny(),
+ GetAddChainToRelayerActionGen().AsAny(),
+ GetAddIbcConnectionActionGen().AsAny(),
+ GetAddIbcChannelActionGen().AsAny(),
+ GetStartHermesActionGen().AsAny(),
+ GetTransferChannelCompleteActionGen().AsAny(),
+ GetRelayPacketsActionGen().AsAny(),
+ GetRelayRewardPacketsToProviderActionGen().AsAny(),
+ GetDelegateTokensActionGen().AsAny(),
+ GetUnbondTokensActionGen().AsAny(),
+ GetRedelegateTokensActionGen().AsAny(),
+ GetDowntimeSlashActionGen().AsAny(),
+ GetUnjailValidatorActionGen().AsAny(),
+ GetRegisterRepresentativeActionGen().AsAny(),
+ GetDoublesignSlashActionGen().AsAny(),
+ GetAssignConsumerPubKeyActionGen().AsAny(),
+ GetSlashThrottleDequeueGen().AsAny(),
+ )
+}
+
+func GetSendTokensActionGen() *rapid.Generator[SendTokensAction] {
+ return rapid.Custom(func(t *rapid.T) SendTokensAction {
+ return SendTokensAction{
+ Amount: rapid.Uint().Draw(t, "Amount"),
+ Chain: GetChainIDGen().Draw(t, "Chain"),
+ From: GetValidatorIDGen().Draw(t, "From"),
+ To: GetValidatorIDGen().Draw(t, "To"),
+ }
+ })
+}
+
+func GetStartChainActionGen() *rapid.Generator[StartChainAction] {
+ return rapid.Custom(func(t *rapid.T) StartChainAction {
+ return StartChainAction{
+ Chain: GetChainIDGen().Draw(t, "Chain"),
+ Validators: GetStartChainValidatorsGen().Draw(t, "Validators"),
+ GenesisChanges: rapid.String().Draw(t, "GenesisChanges"),
+ SkipGentx: rapid.Bool().Draw(t, "SkipGentx"),
+ }
+ })
+}
+
+func GetStartChainValidatorsGen() *rapid.Generator[[]StartChainValidator] {
+ return rapid.Custom(func(t *rapid.T) []StartChainValidator {
+ return rapid.SliceOf(GetStartChainValidatorGen()).Draw(t, "StartChainValidators")
+ })
+}
+
+func GetStartChainValidatorGen() *rapid.Generator[StartChainValidator] {
+ return rapid.Custom(func(t *rapid.T) StartChainValidator {
+ return StartChainValidator{
+ Id: GetValidatorIDGen().Draw(t, "Id"),
+ Allocation: rapid.Uint().Draw(t, "Allocation"),
+ Stake: rapid.Uint().Draw(t, "Stake"),
+ }
+ })
+}
+
+func GetSubmitTextProposalActionGen() *rapid.Generator[submitTextProposalAction] {
+ return rapid.Custom(func(t *rapid.T) submitTextProposalAction {
+ return submitTextProposalAction{
+ Chain: GetChainIDGen().Draw(t, "Chain"),
+ From: GetValidatorIDGen().Draw(t, "From"),
+ Deposit: rapid.Uint().Draw(t, "Deposit"),
+ PropType: rapid.String().Draw(t, "PropType"),
+ Title: rapid.String().Draw(t, "Title"),
+ Description: rapid.String().Draw(t, "Description"),
+ }
+ })
+}
+
+func GetSubmitConsumerAdditionProposalActionGen() *rapid.Generator[submitConsumerAdditionProposalAction] {
+ return rapid.Custom(func(t *rapid.T) submitConsumerAdditionProposalAction {
+ return submitConsumerAdditionProposalAction{
+ Chain: GetChainIDGen().Draw(t, "Chain"),
+ From: GetValidatorIDGen().Draw(t, "From"),
+ Deposit: rapid.Uint().Draw(t, "Deposit"),
+ ConsumerChain: GetChainIDGen().Draw(t, "ConsumerChain"),
+ SpawnTime: rapid.Uint().Draw(t, "SpawnTime"),
+ InitialHeight: GetHeightGen().Draw(t, "InitialHeight"),
+ }
+ })
+}
+
+func GetSubmitConsumerRemovalProposalActionGen() *rapid.Generator[submitConsumerRemovalProposalAction] {
+ return rapid.Custom(func(t *rapid.T) submitConsumerRemovalProposalAction {
+ return submitConsumerRemovalProposalAction{
+ Chain: GetChainIDGen().Draw(t, "Chain"),
+ From: GetValidatorIDGen().Draw(t, "From"),
+ Deposit: rapid.Uint().Draw(t, "Deposit"),
+ ConsumerChain: GetChainIDGen().Draw(t, "ConsumerChain"),
+ StopTimeOffset: time.Duration(rapid.Int64().Draw(t, "StopTimeOffset")),
+ }
+ })
+}
+
+func GetSubmitParamChangeProposalActionGen() *rapid.Generator[submitParamChangeProposalAction] {
+ return rapid.Custom(func(t *rapid.T) submitParamChangeProposalAction {
+ return submitParamChangeProposalAction{
+ Chain: GetChainIDGen().Draw(t, "Chain"),
+ From: GetValidatorIDGen().Draw(t, "From"),
+ Deposit: rapid.Uint().Draw(t, "Deposit"),
+ Subspace: rapid.String().Draw(t, "Subspace"),
+ Key: rapid.String().Draw(t, "Key"),
+ Value: rapid.String().Draw(t, "Value"), // TODO: make this more generic
+ }
+ })
+}
+
+func GetSubmitEquivocationProposalActionGen() *rapid.Generator[submitEquivocationProposalAction] {
+ return rapid.Custom(func(t *rapid.T) submitEquivocationProposalAction {
+ return submitEquivocationProposalAction{
+ Chain: GetChainIDGen().Draw(t, "Chain"),
+ From: GetValidatorIDGen().Draw(t, "From"),
+ Deposit: rapid.Uint().Draw(t, "Deposit"),
+ Height: rapid.Int64().Draw(t, "Height"),
+ Time: GetTimeGen().Draw(t, "Time"),
+ Power: rapid.Int64().Draw(t, "Power"),
+ }
+ })
+}
+
+func GetTimeGen() *rapid.Generator[time.Time] {
+ return rapid.Custom(func(t *rapid.T) time.Time {
+ return time.Unix(rapid.Int64().Draw(t, "Unix"), 0)
+ })
+}
+
+func GetVoteGovProposalActionGen() *rapid.Generator[voteGovProposalAction] {
+ return rapid.Custom(func(t *rapid.T) voteGovProposalAction {
+ return voteGovProposalAction{
+ Chain: GetChainIDGen().Draw(t, "Chain"),
+ From: rapid.SliceOf(GetValidatorIDGen()).Draw(t, "From"),
+ Vote: rapid.SliceOf(rapid.String()).Draw(t, "Vote"),
+ PropNumber: rapid.Uint().Draw(t, "PropNumber"),
+ }
+ })
+}
+
+func GetStartConsumerChainActionGen() *rapid.Generator[startConsumerChainAction] {
+ return rapid.Custom(func(t *rapid.T) startConsumerChainAction {
+ return startConsumerChainAction{
+ ConsumerChain: GetChainIDGen().Draw(t, "ConsumerChain"),
+ ProviderChain: GetChainIDGen().Draw(t, "ProviderChain"),
+ Validators: GetStartChainValidatorsGen().Draw(t, "Validators"),
+ GenesisChanges: rapid.String().Draw(t, "GenesisChanges"),
+ }
+ })
+}
+
+func GetAddChainToRelayerActionGen() *rapid.Generator[addChainToRelayerAction] {
+ return rapid.Custom(func(t *rapid.T) addChainToRelayerAction {
+ return addChainToRelayerAction{
+ Chain: GetChainIDGen().Draw(t, "Chain"),
+ Validator: GetValidatorIDGen().Draw(t, "Validator"),
+ }
+ })
+}
+
+func GetAddIbcConnectionActionGen() *rapid.Generator[addIbcConnectionAction] {
+ return rapid.Custom(func(t *rapid.T) addIbcConnectionAction {
+ return addIbcConnectionAction{
+ ChainA: GetChainIDGen().Draw(t, "ChainA"),
+ ChainB: GetChainIDGen().Draw(t, "ChainB"),
+ ClientA: rapid.Uint().Draw(t, "ClientA"),
+ ClientB: rapid.Uint().Draw(t, "ClientB"),
+ }
+ })
+}
+
+func GetAddIbcChannelActionGen() *rapid.Generator[addIbcChannelAction] {
+ return rapid.Custom(func(t *rapid.T) addIbcChannelAction {
+ return addIbcChannelAction{
+ ChainA: GetChainIDGen().Draw(t, "ChainA"),
+ ChainB: GetChainIDGen().Draw(t, "ChainB"),
+ ConnectionA: rapid.Uint().Draw(t, "ConnectionA"),
+ PortA: rapid.String().Draw(t, "PortA"),
+ PortB: rapid.String().Draw(t, "PortB"),
+ Order: rapid.String().Draw(t, "Order"),
+ }
+ })
+}
+
+func GetStartHermesActionGen() *rapid.Generator[startHermesAction] {
+ return rapid.Just(startHermesAction{})
+}
+
+func GetTransferChannelCompleteActionGen() *rapid.Generator[transferChannelCompleteAction] {
+ return rapid.Custom(func(t *rapid.T) transferChannelCompleteAction {
+ return transferChannelCompleteAction{
+ ChainA: GetChainIDGen().Draw(t, "ChainA"),
+ ChainB: GetChainIDGen().Draw(t, "ChainB"),
+ ConnectionA: rapid.Uint().Draw(t, "ConnectionA"),
+ PortA: rapid.String().Draw(t, "PortA"),
+ PortB: rapid.String().Draw(t, "PortB"),
+ Order: rapid.String().Draw(t, "Order"),
+ ChannelA: rapid.Uint().Draw(t, "ChannelA"),
+ ChannelB: rapid.Uint().Draw(t, "ChannelB"),
+ }
+ })
+}
+
+func GetRelayPacketsActionGen() *rapid.Generator[relayPacketsAction] {
+ return rapid.Custom(func(t *rapid.T) relayPacketsAction {
+ return relayPacketsAction{
+ Chain: GetChainIDGen().Draw(t, "Chain"),
+ Port: rapid.String().Draw(t, "Port"),
+ Channel: rapid.Uint().Draw(t, "Channel"),
+ }
+ })
+}
+
+func GetRelayRewardPacketsToProviderActionGen() *rapid.Generator[relayRewardPacketsToProviderAction] {
+ return rapid.Custom(func(t *rapid.T) relayRewardPacketsToProviderAction {
+ return relayRewardPacketsToProviderAction{
+ ConsumerChain: GetChainIDGen().Draw(t, "ConsumerChain"),
+ ProviderChain: GetChainIDGen().Draw(t, "ProviderChain"),
+ Port: rapid.String().Draw(t, "Port"),
+ Channel: rapid.Uint().Draw(t, "Channel"),
+ }
+ })
+}
+
+func GetDelegateTokensActionGen() *rapid.Generator[delegateTokensAction] {
+ return rapid.Custom(func(t *rapid.T) delegateTokensAction {
+ return delegateTokensAction{
+ Chain: GetChainIDGen().Draw(t, "Chain"),
+ Amount: rapid.Uint().Draw(t, "Amount"),
+ From: GetValidatorIDGen().Draw(t, "From"),
+ To: GetValidatorIDGen().Draw(t, "To"),
+ }
+ })
+}
+
+func GetUnbondTokensActionGen() *rapid.Generator[unbondTokensAction] {
+ return rapid.Custom(func(t *rapid.T) unbondTokensAction {
+ return unbondTokensAction{
+ Chain: GetChainIDGen().Draw(t, "Chain"),
+ Amount: rapid.Uint().Draw(t, "Amount"),
+ Sender: GetValidatorIDGen().Draw(t, "Sender"),
+ UnbondFrom: GetValidatorIDGen().Draw(t, "UnbondFrom"),
+ }
+ })
+}
+
+func GetRedelegateTokensActionGen() *rapid.Generator[redelegateTokensAction] {
+ return rapid.Custom(func(t *rapid.T) redelegateTokensAction {
+ return redelegateTokensAction{
+ Chain: GetChainIDGen().Draw(t, "Chain"),
+ Amount: rapid.Uint().Draw(t, "Amount"),
+ Src: GetValidatorIDGen().Draw(t, "Src"),
+ Dst: GetValidatorIDGen().Draw(t, "Dst"),
+ TxSender: GetValidatorIDGen().Draw(t, "TxSender"),
+ }
+ })
+}
+
+func GetDowntimeSlashActionGen() *rapid.Generator[downtimeSlashAction] {
+ return rapid.Custom(func(t *rapid.T) downtimeSlashAction {
+ return downtimeSlashAction{
+ Chain: GetChainIDGen().Draw(t, "Chain"),
+ Validator: GetValidatorIDGen().Draw(t, "Validator"),
+ }
+ })
+}
+
+func GetUnjailValidatorActionGen() *rapid.Generator[unjailValidatorAction] {
+ return rapid.Custom(func(t *rapid.T) unjailValidatorAction {
+ return unjailValidatorAction{
+ Validator: GetValidatorIDGen().Draw(t, "Validator"),
+ Provider: GetChainIDGen().Draw(t, "Provider"),
+ }
+ })
+}
+
+func GetRegisterRepresentativeActionGen() *rapid.Generator[registerRepresentativeAction] {
+ return rapid.Custom(func(t *rapid.T) registerRepresentativeAction {
+ return registerRepresentativeAction{
+ Chain: GetChainIDGen().Draw(t, "Chain"),
+ Representatives: rapid.SliceOf(GetValidatorIDGen()).Draw(t, "Representatives"),
+ Stakes: rapid.SliceOf(rapid.Uint()).Draw(t, "Stakes"),
+ }
+ })
+}
+
+func GetDoublesignSlashActionGen() *rapid.Generator[doublesignSlashAction] {
+ return rapid.Custom(func(t *rapid.T) doublesignSlashAction {
+ return doublesignSlashAction{
+ Chain: GetChainIDGen().Draw(t, "Chain"),
+ Validator: GetValidatorIDGen().Draw(t, "Validator"),
+ }
+ })
+}
+
+func GetAssignConsumerPubKeyActionGen() *rapid.Generator[assignConsumerPubKeyAction] {
+ return rapid.Custom(func(t *rapid.T) assignConsumerPubKeyAction {
+ return assignConsumerPubKeyAction{
+ Chain: GetChainIDGen().Draw(t, "Chain"),
+ Validator: GetValidatorIDGen().Draw(t, "Validator"),
+ ConsumerPubkey: rapid.String().Draw(t, "ConsumerPubkey"),
+ ReconfigureNode: rapid.Bool().Draw(t, "ReconfigureNode"),
+ ExpectError: rapid.Bool().Draw(t, "ExpectError"),
+ }
+ })
+}
+
+func GetSlashThrottleDequeueGen() *rapid.Generator[slashThrottleDequeue] {
+ return rapid.Custom(func(t *rapid.T) slashThrottleDequeue {
+ return slashThrottleDequeue{
+ Chain: GetChainIDGen().Draw(t, "Chain"),
+ CurrentQueueSize: rapid.Int().Draw(t, "CurrentQueueSize"),
+ NextQueueSize: rapid.Int().Draw(t, "NextQueueSize"),
+ Timeout: time.Duration(rapid.Int().Draw(t, "Timeout")) * time.Millisecond,
+ }
+ })
+}
diff --git a/tests/e2e/step_rapid_test.go b/tests/e2e/step_rapid_test.go
new file mode 100644
index 0000000000..68c3372d73
--- /dev/null
+++ b/tests/e2e/step_rapid_test.go
@@ -0,0 +1,43 @@
+package main
+
+import (
+ "log"
+ "os"
+ "path/filepath"
+ "testing"
+
+ "pgregory.net/rapid"
+)
+
+func TestReadAndWriteTrace(t *testing.T) {
+ parser := JSONParser{}
+ writer := JSONWriter{}
+
+ dir, err := os.MkdirTemp("", "example")
+ if err != nil {
+ log.Fatal(err)
+ }
+ defer os.RemoveAll(dir) // clean up
+
+ rapid.Check(t, func(t *rapid.T) {
+ trace := GetTraceGen().Draw(t, "Trace")
+ filename := filepath.Join(dir, "trace.json")
+ err := WriteAndReadTrace(parser, writer, trace, filename)
+ if err != nil {
+ t.Fatalf("error writing and reading trace: %v", err)
+ }
+ })
+}
+
+func GetTraceGen() *rapid.Generator[[]Step] {
+ return rapid.SliceOf(GetStepGen())
+}
+
+func GetStepGen() *rapid.Generator[Step] {
+ return rapid.Custom(func(t *rapid.T) Step {
+ return Step{
+ Action: GetActionGen().Draw(t, "Action"),
+ State: GetStateGen().Draw(t, "State"),
+ }
+ })
+}
diff --git a/tests/e2e/trace_handlers_test.go b/tests/e2e/trace_handlers_test.go
index 8b48ae7c5e..5926837076 100644
--- a/tests/e2e/trace_handlers_test.go
+++ b/tests/e2e/trace_handlers_test.go
@@ -35,20 +35,10 @@ func TestWriterThenParser(t *testing.T) {
for name, tc := range tests {
t.Run(name, func(t *testing.T) {
- filename := filepath.Join(dir, name)
- err := writer.WriteTraceToFile(filename, tc.trace)
- if err != nil {
- t.Fatalf("error writing trace to file: %v", err)
- }
-
- got, err := parser.ReadTraceFromFile(filename)
+ filename := filepath.Join(dir, "trace.json")
+ err := WriteAndReadTrace(parser, writer, tc.trace, filename)
if err != nil {
- t.Fatalf("error reading trace from file: %v", err)
- }
-
- diff := cmp.Diff(tc.trace, got, cmp.AllowUnexported(Step{}))
- if diff != "" {
- t.Fatalf(diff)
+ t.Fatalf("error writing and reading trace: %v", err)
}
})
}
@@ -194,3 +184,22 @@ func MarshalAndUnmarshalChainState(chainState ChainState) error {
return nil
}
+
+func WriteAndReadTrace(parser TraceParser, writer TraceWriter, trace []Step, tmp_filepath string) error {
+ err := writer.WriteTraceToFile(tmp_filepath, trace)
+ if err != nil {
+ return fmt.Errorf("error writing trace to file: %v", err)
+ }
+
+ got, err := parser.ReadTraceFromFile(tmp_filepath)
+ if err != nil {
+ return fmt.Errorf("error reading trace from file: %v", err)
+ }
+
+ diff := cmp.Diff(trace, got, cmp.AllowUnexported(Step{}))
+ if diff != "" {
+ return fmt.Errorf(diff)
+ }
+
+ return nil
+}
From a9f22d487f23a1116df96293adbe580996587cac Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Wed, 3 May 2023 07:57:27 +0200
Subject: [PATCH 26/35] Restrict range for time
---
tests/e2e/action_rapid_test.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/e2e/action_rapid_test.go b/tests/e2e/action_rapid_test.go
index 92dba9e879..03b325bc24 100644
--- a/tests/e2e/action_rapid_test.go
+++ b/tests/e2e/action_rapid_test.go
@@ -140,7 +140,7 @@ func GetSubmitEquivocationProposalActionGen() *rapid.Generator[submitEquivocatio
func GetTimeGen() *rapid.Generator[time.Time] {
return rapid.Custom(func(t *rapid.T) time.Time {
- return time.Unix(rapid.Int64().Draw(t, "Unix"), 0)
+ return time.Unix(rapid.Int64Range(-1.5779e+11, 1.5779e+11).Draw(t, "Unix"), 0)
})
}
From 019c6a55fc9d1f6559a110bb8e56ecf5c0c9c367 Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Wed, 3 May 2023 08:19:57 +0200
Subject: [PATCH 27/35] Add test for time marshal/unmarshal
---
tests/e2e/action_rapid_test.go | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/tests/e2e/action_rapid_test.go b/tests/e2e/action_rapid_test.go
index 03b325bc24..5e38660808 100644
--- a/tests/e2e/action_rapid_test.go
+++ b/tests/e2e/action_rapid_test.go
@@ -1,8 +1,10 @@
package main
import (
+ "testing"
"time"
+ "github.com/stretchr/testify/require"
"pgregory.net/rapid"
)
@@ -138,6 +140,18 @@ func GetSubmitEquivocationProposalActionGen() *rapid.Generator[submitEquivocatio
})
}
+func TestMarshalAndUnmarshalTime(t *testing.T) {
+ rapid.Check(t, func(t *rapid.T) {
+ time1 := GetTimeGen().Draw(t, "time")
+ data, err := time1.MarshalJSON()
+ require.NoError(t, err)
+ var time2 time.Time
+ err = time2.UnmarshalJSON(data)
+ require.NoError(t, err)
+ require.Equal(t, time1, time2)
+ })
+}
+
func GetTimeGen() *rapid.Generator[time.Time] {
return rapid.Custom(func(t *rapid.T) time.Time {
return time.Unix(rapid.Int64Range(-1.5779e+11, 1.5779e+11).Draw(t, "Unix"), 0)
From 81a3a4242f55667aaf7ffd2aef14a3ba5a28fe54 Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Wed, 3 May 2023 08:20:43 +0200
Subject: [PATCH 28/35] Make time have a lower bound, since negative numbers
are not supported by RFC3339
---
tests/e2e/action_rapid_test.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/e2e/action_rapid_test.go b/tests/e2e/action_rapid_test.go
index 5e38660808..8901d2edb1 100644
--- a/tests/e2e/action_rapid_test.go
+++ b/tests/e2e/action_rapid_test.go
@@ -154,7 +154,7 @@ func TestMarshalAndUnmarshalTime(t *testing.T) {
func GetTimeGen() *rapid.Generator[time.Time] {
return rapid.Custom(func(t *rapid.T) time.Time {
- return time.Unix(rapid.Int64Range(-1.5779e+11, 1.5779e+11).Draw(t, "Unix"), 0)
+ return time.Unix(rapid.Int64Range(-6.3115e+10, 1.5779e+11).Draw(t, "Unix"), 0)
})
}
From eb21af29182a6adebba1085472f4a59a81e52f82 Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Wed, 3 May 2023 08:22:24 +0200
Subject: [PATCH 29/35] Improve label string for argument to time.Unix
---
tests/e2e/action_rapid_test.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/e2e/action_rapid_test.go b/tests/e2e/action_rapid_test.go
index 8901d2edb1..934ba7d404 100644
--- a/tests/e2e/action_rapid_test.go
+++ b/tests/e2e/action_rapid_test.go
@@ -154,7 +154,7 @@ func TestMarshalAndUnmarshalTime(t *testing.T) {
func GetTimeGen() *rapid.Generator[time.Time] {
return rapid.Custom(func(t *rapid.T) time.Time {
- return time.Unix(rapid.Int64Range(-6.3115e+10, 1.5779e+11).Draw(t, "Unix"), 0)
+ return time.Unix(rapid.Int64Range(-6.3115e+10, 1.5779e+11).Draw(t, "unix time"), 0)
})
}
From 477aea35552239e552eaa25d1cf14a267e88c1d6 Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Wed, 3 May 2023 08:23:38 +0200
Subject: [PATCH 30/35] Correct lower bound for time: 1900 years negative
instead of 2000
---
tests/e2e/action_rapid_test.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/e2e/action_rapid_test.go b/tests/e2e/action_rapid_test.go
index 934ba7d404..424db1fc12 100644
--- a/tests/e2e/action_rapid_test.go
+++ b/tests/e2e/action_rapid_test.go
@@ -154,7 +154,7 @@ func TestMarshalAndUnmarshalTime(t *testing.T) {
func GetTimeGen() *rapid.Generator[time.Time] {
return rapid.Custom(func(t *rapid.T) time.Time {
- return time.Unix(rapid.Int64Range(-6.3115e+10, 1.5779e+11).Draw(t, "unix time"), 0)
+ return time.Unix(rapid.Int64Range(-5.9959e+10, 1.5779e+11).Draw(t, "unix time"), 0)
})
}
From 9d94c72175fb653431d469261cf4502943603584 Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Wed, 3 May 2023 08:41:18 +0200
Subject: [PATCH 31/35] Convert timestamp to utc
---
tests/e2e/action_rapid_test.go | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/tests/e2e/action_rapid_test.go b/tests/e2e/action_rapid_test.go
index 424db1fc12..ae33ac867a 100644
--- a/tests/e2e/action_rapid_test.go
+++ b/tests/e2e/action_rapid_test.go
@@ -148,13 +148,13 @@ func TestMarshalAndUnmarshalTime(t *testing.T) {
var time2 time.Time
err = time2.UnmarshalJSON(data)
require.NoError(t, err)
- require.Equal(t, time1, time2)
+ require.True(t, time1.Equal(time2))
})
}
func GetTimeGen() *rapid.Generator[time.Time] {
return rapid.Custom(func(t *rapid.T) time.Time {
- return time.Unix(rapid.Int64Range(-5.9959e+10, 1.5779e+11).Draw(t, "unix time"), 0)
+ return time.Unix(rapid.Int64Range(-5.9959e+10, 1.5779e+11).Draw(t, "unix time"), 0).UTC()
})
}
From 37e8be098495249f447abbc3dd8c1320a4d99848 Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Wed, 3 May 2023 10:29:36 +0200
Subject: [PATCH 32/35] Format file
---
tests/e2e/trace_handlers_test.go | 1 -
1 file changed, 1 deletion(-)
diff --git a/tests/e2e/trace_handlers_test.go b/tests/e2e/trace_handlers_test.go
index 693dd9e62d..5926837076 100644
--- a/tests/e2e/trace_handlers_test.go
+++ b/tests/e2e/trace_handlers_test.go
@@ -3,7 +3,6 @@ package main
import (
"encoding/json"
"fmt"
-
"log"
"os"
"path/filepath"
From 0a6f16f28092ad00b1fb26a3339ccaf49c2ae5ad Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Wed, 3 May 2023 10:30:19 +0200
Subject: [PATCH 33/35] Ignore testdata folder
---
tests/e2e/.gitignore | 1 +
1 file changed, 1 insertion(+)
create mode 100644 tests/e2e/.gitignore
diff --git a/tests/e2e/.gitignore b/tests/e2e/.gitignore
new file mode 100644
index 0000000000..d383c56fff
--- /dev/null
+++ b/tests/e2e/.gitignore
@@ -0,0 +1 @@
+testdata
From f01a5afa0348e33d2dd854f1fcf79be3eb470457 Mon Sep 17 00:00:00 2001
From: Philip Offtermatt
Date: Wed, 3 May 2023 10:41:25 +0200
Subject: [PATCH 34/35] Add go comment
---
tests/e2e/step_rapid_test.go | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/tests/e2e/step_rapid_test.go b/tests/e2e/step_rapid_test.go
index 68c3372d73..ad5ce05833 100644
--- a/tests/e2e/step_rapid_test.go
+++ b/tests/e2e/step_rapid_test.go
@@ -9,6 +9,12 @@ import (
"pgregory.net/rapid"
)
+// TestReadAndWriteTrace uses rapid to do property based testing
+// of reading and writing traces.
+// It generates a random trace, writes it to a file, then reads it back.
+// It then compares the original trace to the read trace.
+// If the traces are not equal, rapid will generate a minimal example
+// that causes the test to fail.
func TestReadAndWriteTrace(t *testing.T) {
parser := JSONParser{}
writer := JSONWriter{}
From 6bb177ab78f378bd92f0cc8649426d5aefe8b0bb Mon Sep 17 00:00:00 2001
From: Philip Offtermatt <57488781+p-offtermatt@users.noreply.github.com>
Date: Mon, 8 May 2023 07:48:29 +0200
Subject: [PATCH 35/35] Add docstring to GetTraceGen
---
tests/e2e/step_rapid_test.go | 2 ++
1 file changed, 2 insertions(+)
diff --git a/tests/e2e/step_rapid_test.go b/tests/e2e/step_rapid_test.go
index ad5ce05833..dde5f2f465 100644
--- a/tests/e2e/step_rapid_test.go
+++ b/tests/e2e/step_rapid_test.go
@@ -35,6 +35,8 @@ func TestReadAndWriteTrace(t *testing.T) {
})
}
+// This can be used to test writing and parsing traces, but does not make much sense
+// for testing trace execution, since the generated traces are almost guaranteed to be nonsensical.
func GetTraceGen() *rapid.Generator[[]Step] {
return rapid.SliceOf(GetStepGen())
}