Search Apps Documentation Source Content File Folder Download Copy Actions Download State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

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}