misbehaviour.gno
2.03 Kb · 79 lines
1package cometbls
2
3import (
4 "time"
5
6 "gno.land/p/nt/ufmt/v0"
7 "gno.land/p/onbloc/ibc/union/types"
8)
9
10var FrozenHeight = types.NewHeightWithRevision(0, 1)
11
12type Misbehaviour struct {
13 Header1 *Header
14 Header2 *Header
15}
16
17func NewMisbehaviour(header1 *Header, header2 *Header) *Misbehaviour {
18 return &Misbehaviour{Header1: header1, Header2: header2}
19}
20
21func (Misbehaviour) ClientType() string {
22 return ClientType
23}
24
25// GetTime returns the timestamp at which misbehaviour occurred. It uses the
26// maximum value from both headers to prevent producing an invalid header outside
27// of the misbehaviour age range.
28func (m *Misbehaviour) GetTime() time.Time {
29 t1, t2 := m.Header1.GetTime(), m.Header2.GetTime()
30 if t1.After(t2) {
31 return t1
32 }
33
34 return t2
35}
36
37// ValidateBasic implements Misbehaviour interface
38func (m *Misbehaviour) ValidateBasic() error {
39 if m.Header1 == nil {
40 return errorWithDetails(ErrInvalidHeader, "misbehaviour Header_1 cannot be nil")
41 }
42
43 if m.Header2 == nil {
44 return errorWithDetails(ErrInvalidHeader, "misbehaviour Header_2 cannot be nil")
45 }
46
47 if m.Header1.TrustedHeight.RevisionHeight == 0 {
48 return errorWithDetails(ErrInvalidHeaderHeight, "misbehaviour Header_1 cannot have zero revision height")
49 }
50
51 if m.Header2.TrustedHeight.RevisionHeight == 0 {
52 return errorWithDetails(ErrInvalidHeaderHeight, "misbehaviour Header_2 cannot have zero revision height")
53 }
54
55 // ValidateBasic on both validators
56 if err := m.Header1.ValidateBasic(); err != nil {
57 return errorWithDetails(
58 ErrInvalidMisbehaviour,
59 ufmt.Sprintf("header 1 failed validation: %v", err),
60 )
61 }
62
63 if err := m.Header2.ValidateBasic(); err != nil {
64 return errorWithDetails(
65 ErrInvalidMisbehaviour,
66 ufmt.Sprintf("header 2 failed validation: %v", err),
67 )
68 }
69
70 // Ensure that Height1 is greater than or equal to Height2
71 if m.Header1.GetHeight().LT(m.Header2.GetHeight()) {
72 return errorWithDetails(
73 ErrInvalidMisbehaviour,
74 ufmt.Sprintf("Header_1 height is less than Header_2 height (%s < %s)", m.Header1.GetHeight(), m.Header2.GetHeight()),
75 )
76 }
77
78 return nil
79}