@@ -3,11 +3,13 @@ package mock
33import (
44 "context"
55 "crypto/sha256"
6+ fmt "fmt"
67 "time"
78
89 "github.com/cosmos/cosmos-sdk/codec"
910 sdk "github.com/cosmos/cosmos-sdk/types"
1011 clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
12+ "github.com/cosmos/ibc-go/v7/modules/core/exported"
1113
1214 mocktypes "github.com/datachainlab/ibc-mock-client/modules/light-clients/xx-mock/types"
1315 "github.com/hyperledger-labs/yui-relayer/core"
@@ -58,30 +60,47 @@ func (pr *Prover) SetupHeadersForUpdate(_ core.FinalityAwareChain, latestFinaliz
5860 return []core.Header {latestFinalizedHeader .(* mocktypes.Header )}, nil
5961}
6062
61- // GetLatestFinalizedHeader returns the latest finalized header
62- func (pr * Prover ) GetLatestFinalizedHeader () (latestFinalizedHeader core.Header , err error ) {
63- chainLatestHeight , err := pr .chain .LatestHeight ()
63+ func (pr * Prover ) createMockHeader (height exported.Height ) (core.Header , error ) {
64+ timestamp , err := pr .chain .Timestamp (height )
6465 if err != nil {
65- return nil , err
66+ return nil , fmt .Errorf ("failed to get block timestamp at height:%v" , height )
67+ }
68+ return & mocktypes.Header {
69+ Height : clienttypes.Height {
70+ RevisionNumber : height .GetRevisionNumber (),
71+ RevisionHeight : height .GetRevisionHeight (),
72+ },
73+ Timestamp : uint64 (timestamp .UnixNano ()),
74+ }, nil
75+ }
76+
77+ func (pr * Prover ) getDelayedLatestFinalizedHeight () (exported.Height , error ) {
78+ height , err := pr .chain .LatestHeight ()
79+ if err != nil {
80+ return nil , fmt .Errorf ("failed to get latest height: %v" , err )
6681 }
6782 for i := uint64 (0 ); i < pr .config .FinalityDelay ; i ++ {
68- if prevHeight , success := chainLatestHeight .Decrement (); success {
69- chainLatestHeight = prevHeight
83+ if h , ok := height .Decrement (); ok {
84+ height = h
7085 } else {
7186 break
7287 }
7388 }
74- timestamp , err := pr .chain .Timestamp (chainLatestHeight )
75- if err != nil {
89+ return height , nil
90+ }
91+
92+ // GetFinalizedHeader returns the finalized header at `height`
93+ func (pr * Prover ) GetFinalizedHeader (height uint64 ) (core.Header , error ) {
94+ if latestFinalizedHeight , err := pr .getDelayedLatestFinalizedHeight (); err != nil {
7695 return nil , err
96+ } else if height == 0 {
97+ return pr .createMockHeader (latestFinalizedHeight )
98+ } else if height > latestFinalizedHeight .GetRevisionHeight () {
99+ return nil , fmt .Errorf ("the requested height is greater than the latest finalized height: %v > %v" , height , latestFinalizedHeight )
100+ } else {
101+ ics02Height := clienttypes .NewHeight (latestFinalizedHeight .GetRevisionNumber (), height )
102+ return pr .createMockHeader (ics02Height )
77103 }
78- return & mocktypes.Header {
79- Height : clienttypes.Height {
80- RevisionNumber : chainLatestHeight .GetRevisionNumber (),
81- RevisionHeight : chainLatestHeight .GetRevisionHeight (),
82- },
83- Timestamp : uint64 (timestamp .UnixNano ()),
84- }, nil
85104}
86105
87106// CheckRefreshRequired always returns false because mock clients don't need refresh.
0 commit comments