Skip to content

Commit dc8fb2b

Browse files
committed
fix(op): 'latest' RPC call-opt always fixed to concrete number
1 parent ff769cd commit dc8fb2b

File tree

6 files changed

+56
-37
lines changed

6 files changed

+56
-37
lines changed

rolling-shutter/keyperimpl/optimism/sync/event/events.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ type (
1313
Threshold uint64
1414
Eon uint64
1515

16-
AtBlockNumber *number.BlockNumber
16+
AtBlockNumber *number.BlockNumber `json:",omitempty"`
1717
}
1818
EonPublicKey struct {
1919
Eon uint64
@@ -24,7 +24,7 @@ type (
2424
ShutterState struct {
2525
Active bool
2626

27-
AtBlockNumber *number.BlockNumber
27+
AtBlockNumber *number.BlockNumber `json:",omitempty"`
2828
}
2929
LatestBlock struct {
3030
Number *number.BlockNumber

rolling-shutter/keyperimpl/optimism/sync/syncer/eonpubkey.go

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -113,15 +113,10 @@ func (s *EonPubKeySyncer) logCallError(attrName string, err error) {
113113

114114
func (s *EonPubKeySyncer) GetEonPubKeyForEon(ctx context.Context, opts *bind.CallOpts, eon uint64) (*event.EonPublicKey, error) {
115115
var err error
116-
if err := guardCallOpts(opts, true); err != nil {
116+
opts, _, err = fixCallOpts(ctx, s.Client, opts)
117+
if err != nil {
117118
return nil, err
118119
}
119-
if number.BigToBlockNumber(opts.BlockNumber).IsLatest() {
120-
opts, err = fixCallOpts(ctx, s.Client, opts)
121-
if err != nil {
122-
return nil, err
123-
}
124-
}
125120
key, err := s.KeyBroadcast.GetEonKey(opts, eon)
126121
// XXX: can the key be a null byte?
127122
// I think we rather get a index out of bounds error.

rolling-shutter/keyperimpl/optimism/sync/syncer/keyperset.go

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,8 @@ func (s *KeyperSetSyncer) getInitialKeyperSets(ctx context.Context) ([]*event.Ke
121121
}
122122

123123
func (s *KeyperSetSyncer) GetKeyperSetByIndex(ctx context.Context, opts *bind.CallOpts, index uint64) (*event.KeyperSet, error) {
124-
if err := guardCallOpts(opts, true); err != nil {
124+
opts, _, err := fixCallOpts(ctx, s.Client, opts)
125+
if err != nil {
125126
return nil, err
126127
}
127128
actBl, err := s.Contract.GetKeyperSetActivationBlock(opts, index)
@@ -136,18 +137,28 @@ func (s *KeyperSetSyncer) GetKeyperSetByIndex(ctx context.Context, opts *bind.Ca
136137
}
137138

138139
func (s *KeyperSetSyncer) GetKeyperSetForBlock(ctx context.Context, opts *bind.CallOpts, b *number.BlockNumber) (*event.KeyperSet, error) {
139-
var latestBlock uint64
140+
var atBlock uint64
140141
var err error
141-
if err := guardCallOpts(opts, true); err != nil {
142+
143+
opts, latestFromFix, err := fixCallOpts(ctx, s.Client, opts)
144+
if err != nil {
142145
return nil, err
143146
}
144147

145148
if b.Equal(number.LatestBlock) {
146-
latestBlock, err = s.Client.BlockNumber(ctx)
149+
if latestFromFix == nil {
150+
atBlock, err = s.Client.BlockNumber(ctx)
151+
if err != nil {
152+
return nil, errors.Wrap(err, "get current block-number")
153+
}
154+
} else {
155+
atBlock = *latestFromFix
156+
}
147157
} else {
148-
latestBlock = b.Uint64()
158+
atBlock = b.Uint64()
149159
}
150-
idx, err := s.Contract.GetKeyperSetIndexByBlock(opts, latestBlock)
160+
161+
idx, err := s.Contract.GetKeyperSetIndexByBlock(opts, atBlock)
151162
if err != nil {
152163
return nil, errors.Wrap(err, "could not retrieve keyper set index")
153164
}

rolling-shutter/keyperimpl/optimism/sync/syncer/shutterstate.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ package syncer
22

33
import (
44
"context"
5-
"errors"
65

76
"github.com/ethereum/go-ethereum/accounts/abi/bind"
87
"github.com/ethereum/go-ethereum/log"
8+
"github.com/pkg/errors"
99
"github.com/shutter-network/shop-contracts/bindings"
1010

1111
"github.com/shutter-network/rolling-shutter/rolling-shutter/keyperimpl/optimism/sync/client"
@@ -26,17 +26,17 @@ type ShutterStateSyncer struct {
2626
}
2727

2828
func (s *ShutterStateSyncer) GetShutterState(ctx context.Context, opts *bind.CallOpts) (*event.ShutterState, error) {
29-
if opts == nil {
30-
opts = &bind.CallOpts{
31-
Context: ctx,
32-
}
29+
opts, _, err := fixCallOpts(ctx, s.Client, opts)
30+
if err != nil {
31+
return nil, err
3332
}
3433
isPaused, err := s.Contract.Paused(opts)
3534
if err != nil {
36-
return nil, err
35+
return nil, errors.Wrap(err, "query paused state")
3736
}
3837
return &event.ShutterState{
39-
Active: !isPaused,
38+
Active: !isPaused,
39+
AtBlockNumber: number.BigToBlockNumber(opts.BlockNumber),
4040
}, nil
4141
}
4242

rolling-shutter/keyperimpl/optimism/sync/syncer/util.go

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,20 @@ package syncer
22

33
import (
44
"context"
5-
"errors"
65
"math/big"
76

87
"github.com/ethereum/go-ethereum/accounts/abi/bind"
98
"github.com/ethereum/go-ethereum/core/types"
9+
"github.com/pkg/errors"
1010

1111
"github.com/shutter-network/rolling-shutter/rolling-shutter/keyperimpl/optimism/sync/client"
1212
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/encodeable/number"
1313
)
1414

1515
var (
16-
errNilCallOpts = errors.New("nil call-opts")
17-
errLatestBlock = errors.New("'nil' latest block")
16+
errNilCallOpts = errors.New("nil call-opts")
17+
errNilOptsBlockNumber = errors.New("opts block-number is nil, but 'latest' not allowed")
18+
errLatestBlock = errors.New("'nil' latest block")
1819
)
1920

2021
func logToCallOpts(ctx context.Context, log *types.Log) *bind.CallOpts {
@@ -31,35 +32,35 @@ func guardCallOpts(opts *bind.CallOpts, allowLatest bool) error {
3132
return errNilCallOpts
3233
}
3334
if !allowLatest {
34-
n := number.BlockNumber{Int: opts.BlockNumber}
35+
n := number.BigToBlockNumber(opts.BlockNumber)
3536
if n.IsLatest() {
3637
return errLatestBlock
3738
}
3839
}
3940
return nil
4041
}
4142

42-
func fixCallOpts(ctx context.Context, c client.Client, opts *bind.CallOpts) (*bind.CallOpts, error) {
43+
func fixCallOpts(ctx context.Context, c client.Client, opts *bind.CallOpts) (*bind.CallOpts, *uint64, error) {
4344
err := guardCallOpts(opts, false)
44-
if err != nil {
45-
return opts, nil
45+
if err == nil {
46+
return opts, nil, nil
4647
}
4748
// query the current latest block and fix it
48-
latest, err := c.BlockNumber(ctx)
49-
if err != nil {
50-
return nil, err
49+
latest, queryErr := c.BlockNumber(ctx)
50+
if queryErr != nil {
51+
return nil, nil, errors.Wrap(err, "query latest block-number")
5152
}
5253
blockNumber := number.NewBlockNumber(&latest)
5354
if errors.Is(err, errNilCallOpts) {
5455
opts = &bind.CallOpts{
5556
Context: ctx,
5657
BlockNumber: blockNumber.Int,
5758
}
58-
return opts, nil
59+
return opts, &latest, nil
5960
}
6061
if errors.Is(err, errLatestBlock) {
6162
opts.BlockNumber = blockNumber.Int
62-
return opts, nil
63+
return opts, &latest, nil
6364
}
64-
return nil, err
65+
return nil, nil, err
6566
}

rolling-shutter/medley/encodeable/number/block.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ var (
1515
var ErrLatestBlockToUint = errors.New("'latest' block can't be converted to uint64")
1616

1717
func BigToBlockNumber(i *big.Int) *BlockNumber {
18+
if i == nil {
19+
return NewBlockNumber(nil)
20+
}
1821
return &BlockNumber{
1922
Int: i,
2023
}
@@ -36,12 +39,21 @@ type BlockNumber struct {
3639
*big.Int
3740
}
3841

42+
func (k *BlockNumber) MarshalJSON() ([]byte, error) {
43+
return k.MarshalText()
44+
}
45+
46+
func (k *BlockNumber) UnmarshalJSON(b []byte) error {
47+
return k.UnmarshalText(b)
48+
}
49+
3950
func (k *BlockNumber) UnmarshalText(b []byte) error {
40-
k.Int = &big.Int{}
51+
k.Int = new(big.Int)
4152
if bytes.Equal(b, LatestStr) {
4253
k.Int.SetInt64(LatestBlockInt)
4354
return nil
4455
}
56+
4557
return k.Int.UnmarshalText(b)
4658
}
4759

@@ -71,7 +83,7 @@ func (k *BlockNumber) Equal(b *BlockNumber) bool {
7183

7284
func (k *BlockNumber) MarshalText() ([]byte, error) {
7385
if k.IsLatest() {
74-
return []byte("latest"), nil
86+
return LatestStr, nil
7587
}
7688
return k.Int.MarshalText()
7789
}

0 commit comments

Comments
 (0)