From 3f2da0e4e3df83974003f9a87738321f2f546f7a Mon Sep 17 00:00:00 2001 From: Alexander Shcherbakov Date: Fri, 21 Jan 2022 17:24:46 +0300 Subject: [PATCH] Fix query against the latest state in light client (#7642) --- light/rpc/client.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/light/rpc/client.go b/light/rpc/client.go index 3aab77c99..51dd6e3c0 100644 --- a/light/rpc/client.go +++ b/light/rpc/client.go @@ -149,12 +149,24 @@ func (c *Client) ABCIQuery(ctx context.Context, path string, data tmbytes.HexByt } // ABCIQueryWithOptions returns an error if opts.Prove is false. +// ABCIQueryWithOptions returns the result for the given height (opts.Height). +// If no height is provided, the results of the block preceding the latest are returned. func (c *Client) ABCIQueryWithOptions(ctx context.Context, path string, data tmbytes.HexBytes, opts rpcclient.ABCIQueryOptions) (*coretypes.ResultABCIQuery, error) { // always request the proof opts.Prove = true + // Can't return the latest block results because we won't be able to + // prove them. Return the results for the previous block instead. + if opts.Height == 0 { + res, err := c.next.Status(ctx) + if err != nil { + return nil, fmt.Errorf("can't get latest height: %w", err) + } + opts.Height = res.SyncInfo.LatestBlockHeight - 1 + } + res, err := c.next.ABCIQueryWithOptions(ctx, path, data, opts) if err != nil { return nil, err