/
genesis.go
106 lines (90 loc) · 3.29 KB
/
genesis.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package types
import (
fmt "fmt"
types "github.com/cosmos/cosmos-sdk/codec/types"
sdktx "github.com/cosmos/cosmos-sdk/types/tx"
)
var _ types.UnpackInterfacesMessage = (*GenesisState)(nil)
func NewGenesisState(triggerID, queueStart uint64, triggers []Trigger, gasLimits []GasLimit, queuedTriggers []QueuedTrigger) *GenesisState {
return &GenesisState{
TriggerId: triggerID,
QueueStart: queueStart,
Triggers: triggers,
GasLimits: gasLimits,
QueuedTriggers: queuedTriggers,
}
}
// DefaultGenesis returns the default trigger genesis state
func DefaultGenesis() *GenesisState {
return NewGenesisState(1, 1, []Trigger{}, []GasLimit{}, []QueuedTrigger{})
}
// Validate performs basic genesis state validation returning an error upon any
// failure.
func (gs GenesisState) Validate() error {
if gs.TriggerId == 0 {
return fmt.Errorf("invalid trigger id")
}
if gs.QueueStart == 0 {
return fmt.Errorf("invalid queue start")
}
if len(gs.Triggers)+len(gs.QueuedTriggers) != len(gs.GasLimits) {
return fmt.Errorf("gas limit list length must match sum of triggers and queued triggers length")
}
triggers := append([]Trigger{}, gs.Triggers...)
for _, queuedTrigger := range gs.QueuedTriggers {
triggers = append(triggers, queuedTrigger.GetTrigger())
}
gasLimitMap := make(map[uint64]bool)
for _, gasLimit := range gs.GasLimits {
if _, found := gasLimitMap[gasLimit.TriggerId]; found {
return fmt.Errorf("cannot have duplicate trigger id (%d) in gas limits", gasLimit.TriggerId)
}
gasLimitMap[gasLimit.TriggerId] = true
}
triggerMap := make(map[uint64]bool)
for _, trigger := range triggers {
msgs, err := sdktx.GetMsgs(trigger.Actions, "Genesis - Validate")
if err != nil {
return fmt.Errorf("could not get msgs for trigger with id %d: %w", trigger.GetId(), err)
}
for idx, msg := range msgs {
if err = msg.ValidateBasic(); err != nil {
return fmt.Errorf("trigger id: %d, msg: %d, err: %w", trigger.GetId(), idx, err)
}
}
if trigger.GetId() > gs.TriggerId {
return fmt.Errorf("trigger id %d is invalid and cannot exceed %d", trigger.GetId(), gs.TriggerId)
}
event, err := trigger.GetTriggerEventI()
if err != nil {
return fmt.Errorf("could not get event for trigger with id %d: %w", trigger.GetId(), err)
}
if err = event.Validate(); err != nil {
return fmt.Errorf("could not validate event for trigger with id %d: %w", trigger.GetId(), err)
}
if _, found := gasLimitMap[trigger.GetId()]; !found {
return fmt.Errorf("trigger or queued trigger does not have a gas limit that matches it with id %d", trigger.GetId())
}
if _, found := triggerMap[trigger.GetId()]; found {
return fmt.Errorf("trigger id %d is not unique within the set all triggers and queued triggers", trigger.GetId())
}
triggerMap[trigger.GetId()] = true
}
return nil
}
// UnpackInterfaces implements UnpackInterfacesMessage.UnpackInterfaces
func (gs GenesisState) UnpackInterfaces(unpacker types.AnyUnpacker) error {
for i, t := range gs.Triggers {
err := t.UnpackInterfaces(unpacker)
if err != nil {
return fmt.Errorf("failed to unpack Triggers[%d]: %w", i, err)
}
}
for i, q := range gs.QueuedTriggers {
err := q.UnpackInterfaces(unpacker)
if err != nil {
return fmt.Errorf("failed to unpack QueuedTriggers[%d]: %w", i, err)
}
}
return nil
}