Skip to content

Commit 134955c

Browse files
authored
fix: when pending data is invalid return empty pending/pre_confirmed for latest (#2965)
* Pending Data never nil * tests * remove unused error * remove prints
1 parent 20fe048 commit 134955c

17 files changed

+208
-78
lines changed

rpc/v6/block_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ func TestBlockTransactionCount(t *testing.T) {
185185
latestBlock.Hash = nil
186186
latestBlock.GlobalStateRoot = nil
187187
mockSyncReader.EXPECT().PendingData().Return(nil, sync.ErrPendingBlockNotFound)
188+
mockReader.EXPECT().HeadsHeader().Return(nil, db.ErrKeyNotFound)
188189

189190
count, rpcErr := handler.BlockTransactionCount(rpc.BlockID{Pending: true})
190191
require.Equal(t, rpccore.ErrBlockNotFound, rpcErr)

rpc/v6/pending_data_wrapper.go

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package rpcv6
22

33
import (
4+
"errors"
45
"time"
56

67
"github.com/NethermindEth/juno/core"
@@ -10,21 +11,22 @@ import (
1011

1112
func (h *Handler) PendingData() (*core.PendingData, error) {
1213
pending, err := h.syncReader.PendingData()
13-
if err != nil {
14+
if err != nil && !errors.Is(err, sync.ErrPendingBlockNotFound) {
1415
return nil, err
1516
}
1617
// If pending network is polling pending block and running on < 0.14.0
17-
if pending.Variant() == core.PendingBlockVariant {
18+
if err == nil && pending.Variant() == core.PendingBlockVariant {
1819
return pending, nil
19-
} else {
20-
// If pre_confirmed, network is polling pre_confirmed block and running on >= 0.14.0
21-
latestHeader, err := h.bcReader.HeadsHeader()
22-
if err != nil {
23-
return nil, err
24-
}
25-
emptyPending := emptyPendingForParent(latestHeader).AsPendingData()
26-
return &emptyPending, nil
2720
}
21+
22+
// If pre_confirmed, network is polling pre_confirmed block and running on >= 0.14.0
23+
latestHeader, err := h.bcReader.HeadsHeader()
24+
if err != nil {
25+
return nil, err
26+
}
27+
emptyPending := emptyPendingForParent(latestHeader)
28+
emptyPendingData := emptyPending.AsPendingData()
29+
return &emptyPendingData, nil
2830
}
2931

3032
func (h *Handler) PendingBlock() *core.Block {
@@ -35,7 +37,7 @@ func (h *Handler) PendingBlock() *core.Block {
3537
return pending.GetBlock()
3638
}
3739

38-
func emptyPendingForParent(parentHeader *core.Header) *sync.Pending {
40+
func emptyPendingForParent(parentHeader *core.Header) sync.Pending {
3941
receipts := make([]*core.TransactionReceipt, 0)
4042
pendingBlock := &core.Block{
4143
Header: &core.Header{
@@ -63,7 +65,7 @@ func emptyPendingForParent(parentHeader *core.Header) *sync.Pending {
6365
ReplacedClasses: make(map[felt.Felt]*felt.Felt),
6466
}
6567

66-
return &sync.Pending{
68+
return sync.Pending{
6769
Block: pendingBlock,
6870
StateUpdate: &core.StateUpdate{
6971
OldRoot: parentHeader.GlobalStateRoot,

rpc/v6/transaction_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ func TestTransactionByHashNotFound(t *testing.T) {
5151

5252
randomTxHash := new(felt.Felt).SetBytes([]byte("random hash"))
5353
mockReader.EXPECT().TransactionByHash(randomTxHash).Return(nil, db.ErrKeyNotFound)
54+
mockReader.EXPECT().HeadsHeader().Return(nil, db.ErrKeyNotFound)
5455
mockSyncReader.EXPECT().PendingData().Return(nil, sync.ErrPendingBlockNotFound)
5556

5657
n := &utils.Mainnet
@@ -629,6 +630,7 @@ func TestTransactionReceiptByHash(t *testing.T) {
629630

630631
mockReader.EXPECT().TransactionByHash(gomock.Any()).Return(nil, db.ErrKeyNotFound)
631632
mockSyncReader.EXPECT().PendingData().Return(nil, sync.ErrPendingBlockNotFound)
633+
mockReader.EXPECT().HeadsHeader().Return(nil, db.ErrKeyNotFound)
632634

633635
txHash := new(felt.Felt).SetBytes([]byte("some tx hash"))
634636
tx, rpcErr := handler.TransactionReceiptByHash(*txHash)
@@ -1554,6 +1556,7 @@ func TestTransactionStatus(t *testing.T) {
15541556
mockReader.EXPECT().TransactionByHash(notFoundTest.hash).Return(nil, db.ErrKeyNotFound).Times(2)
15551557
syncReader.EXPECT().PendingData().Return(nil, sync.ErrPendingBlockNotFound).Times(2)
15561558
handler := rpc.New(mockReader, syncReader, nil, "", test.network, nil)
1559+
mockReader.EXPECT().HeadsHeader().Return(nil, db.ErrKeyNotFound).Times(2)
15571560
_, err := handler.TransactionStatus(ctx, *notFoundTest.hash)
15581561
require.Equal(t, rpccore.ErrTxnHashNotFound.Code, err.Code)
15591562

@@ -1571,6 +1574,7 @@ func TestTransactionStatus(t *testing.T) {
15711574
syncReader := mocks.NewMockSyncReader(mockCtrl)
15721575
mockReader.EXPECT().TransactionByHash(test.notFoundTxHash).Return(nil, db.ErrKeyNotFound)
15731576
syncReader.EXPECT().PendingData().Return(nil, sync.ErrPendingBlockNotFound)
1577+
mockReader.EXPECT().HeadsHeader().Return(nil, db.ErrKeyNotFound)
15741578
handler := rpc.New(mockReader, syncReader, nil, "", test.network, nil).WithFeeder(client)
15751579

15761580
_, err := handler.TransactionStatus(ctx, *test.notFoundTxHash)
@@ -1733,6 +1737,7 @@ func TestSubmittedTransactionsCache(t *testing.T) {
17331737
require.Nil(t, err)
17341738
mockReader.EXPECT().TransactionByHash(res.TransactionHash).Return(nil, db.ErrKeyNotFound)
17351739
mockSyncReader.EXPECT().PendingData().Return(nil, sync.ErrPendingBlockNotFound)
1740+
mockReader.EXPECT().HeadsHeader().Return(nil, db.ErrKeyNotFound)
17361741

17371742
status, err := handler.TransactionStatus(ctx, *res.TransactionHash)
17381743
require.Nil(t, err)
@@ -1753,6 +1758,7 @@ func TestSubmittedTransactionsCache(t *testing.T) {
17531758
require.Nil(t, err)
17541759
mockReader.EXPECT().TransactionByHash(res.TransactionHash).Return(nil, db.ErrKeyNotFound)
17551760
mockSyncReader.EXPECT().PendingData().Return(nil, sync.ErrPendingBlockNotFound)
1761+
mockReader.EXPECT().HeadsHeader().Return(nil, db.ErrKeyNotFound)
17561762
// Expire cache entry
17571763
time.Sleep(cacheEntryTimeOut)
17581764
status, err := handler.TransactionStatus(ctx, *res.TransactionHash)

rpc/v7/pending_data_wrapper.go

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package rpcv7
22

33
import (
4+
"errors"
45
"time"
56

67
"github.com/NethermindEth/juno/core"
@@ -10,22 +11,22 @@ import (
1011

1112
func (h *Handler) PendingData() (*core.PendingData, error) {
1213
pending, err := h.syncReader.PendingData()
13-
if err != nil {
14+
if err != nil && !errors.Is(err, sync.ErrPendingBlockNotFound) {
1415
return nil, err
1516
}
1617
// If pending network is polling pending block and running on < 0.14.0
17-
if pending.Variant() == core.PendingBlockVariant {
18+
if err == nil && pending.Variant() == core.PendingBlockVariant {
1819
return pending, nil
19-
} else {
20-
// If pre_confirmed, network is polling pre_confirmed block and running on >= 0.14.0
21-
latestHeader, err := h.bcReader.HeadsHeader()
22-
if err != nil {
23-
return nil, err
24-
}
20+
}
2521

26-
emptyPending := emptyPendingForParent(latestHeader).AsPendingData()
27-
return &emptyPending, nil
22+
// If pre_confirmed, network is polling pre_confirmed block and running on >= 0.14.0
23+
latestHeader, err := h.bcReader.HeadsHeader()
24+
if err != nil {
25+
return nil, err
2826
}
27+
emptyPending := emptyPendingForParent(latestHeader)
28+
emptyPendingData := emptyPending.AsPendingData()
29+
return &emptyPendingData, nil
2930
}
3031

3132
func (h *Handler) PendingBlock() *core.Block {
@@ -36,7 +37,7 @@ func (h *Handler) PendingBlock() *core.Block {
3637
return pending.GetBlock()
3738
}
3839

39-
func emptyPendingForParent(parentHeader *core.Header) *sync.Pending {
40+
func emptyPendingForParent(parentHeader *core.Header) sync.Pending {
4041
receipts := make([]*core.TransactionReceipt, 0)
4142
pendingBlock := &core.Block{
4243
Header: &core.Header{
@@ -64,7 +65,7 @@ func emptyPendingForParent(parentHeader *core.Header) *sync.Pending {
6465
ReplacedClasses: make(map[felt.Felt]*felt.Felt),
6566
}
6667

67-
return &sync.Pending{
68+
return sync.Pending{
6869
Block: pendingBlock,
6970
StateUpdate: &core.StateUpdate{
7071
OldRoot: parentHeader.GlobalStateRoot,

rpc/v7/transaction_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ func TestTransactionReceiptByHash(t *testing.T) {
259259
txHash := new(felt.Felt).SetBytes([]byte("random hash"))
260260
mockReader.EXPECT().TransactionByHash(txHash).Return(nil, db.ErrKeyNotFound)
261261
mockSyncer.EXPECT().PendingData().Return(nil, sync.ErrPendingBlockNotFound)
262-
262+
mockReader.EXPECT().HeadsHeader().Return(nil, db.ErrKeyNotFound)
263263
tx, rpcErr := handler.TransactionReceiptByHash(*txHash)
264264
assert.Nil(t, tx)
265265
assert.Equal(t, rpccore.ErrTxnHashNotFound, rpcErr)
@@ -943,7 +943,7 @@ func TestTransactionStatus(t *testing.T) {
943943

944944
mockSyncer := mocks.NewMockSyncReader(mockCtrl)
945945
mockSyncer.EXPECT().PendingData().Return(nil, sync.ErrPendingBlockNotFound).Times(2)
946-
946+
mockReader.EXPECT().HeadsHeader().Return(nil, db.ErrKeyNotFound).Times(2)
947947
handler := rpc.New(mockReader, mockSyncer, nil, "", test.network, nil)
948948
_, err := handler.TransactionStatus(ctx, *notFoundTest.hash)
949949
require.Equal(t, rpccore.ErrTxnHashNotFound.Code, err.Code)
@@ -964,6 +964,7 @@ func TestTransactionStatus(t *testing.T) {
964964

965965
mockSyncer := mocks.NewMockSyncReader(mockCtrl)
966966
mockSyncer.EXPECT().PendingData().Return(nil, sync.ErrPendingBlockNotFound)
967+
mockReader.EXPECT().HeadsHeader().Return(nil, db.ErrKeyNotFound)
967968

968969
handler := rpc.New(mockReader, mockSyncer, nil, "", test.network, nil).WithFeeder(client)
969970

rpc/v8/pending_data_wrapper.go

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package rpcv8
22

33
import (
4+
"errors"
45
"time"
56

67
"github.com/NethermindEth/juno/core"
@@ -10,21 +11,22 @@ import (
1011

1112
func (h *Handler) PendingData() (*core.PendingData, error) {
1213
pending, err := h.syncReader.PendingData()
13-
if err != nil {
14+
if err != nil && !errors.Is(err, sync.ErrPendingBlockNotFound) {
1415
return nil, err
1516
}
1617
// If pending network is polling pending block and running on < 0.14.0
17-
if pending.Variant() == core.PendingBlockVariant {
18+
if err == nil && pending.Variant() == core.PendingBlockVariant {
1819
return pending, nil
19-
} else {
20-
// If pre_confirmed, network is polling pre_confirmed block and running on >= 0.14.0
21-
latestHeader, err := h.bcReader.HeadsHeader()
22-
if err != nil {
23-
return nil, err
24-
}
25-
emptyPending := emptyPendingForParent(latestHeader).AsPendingData()
26-
return &emptyPending, nil
2720
}
21+
22+
// If pre_confirmed, network is polling pre_confirmed block and running on >= 0.14.0
23+
latestHeader, err := h.bcReader.HeadsHeader()
24+
if err != nil {
25+
return nil, err
26+
}
27+
emptyPending := emptyPendingForParent(latestHeader)
28+
emptyPendingData := emptyPending.AsPendingData()
29+
return &emptyPendingData, nil
2830
}
2931

3032
func (h *Handler) PendingBlock() *core.Block {
@@ -35,7 +37,7 @@ func (h *Handler) PendingBlock() *core.Block {
3537
return pending.GetBlock()
3638
}
3739

38-
func emptyPendingForParent(parentHeader *core.Header) *sync.Pending {
40+
func emptyPendingForParent(parentHeader *core.Header) sync.Pending {
3941
receipts := make([]*core.TransactionReceipt, 0)
4042
pendingBlock := &core.Block{
4143
Header: &core.Header{
@@ -63,7 +65,7 @@ func emptyPendingForParent(parentHeader *core.Header) *sync.Pending {
6365
ReplacedClasses: make(map[felt.Felt]*felt.Felt),
6466
}
6567

66-
return &sync.Pending{
68+
return sync.Pending{
6769
Block: pendingBlock,
6870
StateUpdate: &core.StateUpdate{
6971
OldRoot: parentHeader.GlobalStateRoot,

rpc/v8/subscriptions_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ func TestSubscribeTxnStatus(t *testing.T) {
268268

269269
mockChain.EXPECT().TransactionByHash(txHash).Return(nil, db.ErrKeyNotFound).AnyTimes()
270270
mockSyncer.EXPECT().PendingData().Return(nil, sync.ErrPendingBlockNotFound).AnyTimes()
271-
271+
mockChain.EXPECT().HeadsHeader().Return(nil, db.ErrKeyNotFound).AnyTimes()
272272
id, _ := createTestTxStatusWebsocket(t, handler, txHash)
273273

274274
_, hasSubscription := handler.subscriptions.Load(string(id))
@@ -288,6 +288,7 @@ func TestSubscribeTxnStatus(t *testing.T) {
288288
handler := New(mockChain, mockSyncer, nil, "", log)
289289
handler.WithFeeder(feeder.NewTestClient(t, &utils.SepoliaIntegration))
290290
mockSyncer.EXPECT().PendingData().Return(nil, sync.ErrPendingBlockNotFound).AnyTimes()
291+
mockChain.EXPECT().HeadsHeader().Return(nil, db.ErrKeyNotFound).AnyTimes()
291292
t.Run("reverted", func(t *testing.T) {
292293
txHash, err := new(felt.Felt).SetString("0x1011")
293294
require.NoError(t, err)
@@ -335,6 +336,7 @@ func TestSubscribeTxnStatus(t *testing.T) {
335336

336337
mockChain.EXPECT().TransactionByHash(txHash).Return(nil, db.ErrKeyNotFound)
337338
mockSyncer.EXPECT().PendingData().Return(nil, sync.ErrPendingBlockNotFound)
339+
mockChain.EXPECT().HeadsHeader().Return(nil, db.ErrKeyNotFound)
338340
id, conn := createTestTxStatusWebsocket(t, handler, txHash)
339341
assertNextTxnStatus(t, conn, id, txHash, TxnStatusReceived, TxnSuccess, "")
340342

@@ -694,7 +696,7 @@ func TestSubscribePendingTxs(t *testing.T) {
694696
mockChain := mocks.NewMockReader(mockCtrl)
695697
l1Feed := feed.New[*core.L1Head]()
696698
mockChain.EXPECT().SubscribeL1Head().Return(blockchain.L1HeadSubscription{Subscription: l1Feed.Subscribe()})
697-
699+
mockChain.EXPECT().HeadsHeader().Return(nil, db.ErrKeyNotFound).Times(3)
698700
syncer := newFakeSyncer()
699701
handler, server := setupRPC(t, ctx, mockChain, syncer)
700702

rpc/v8/transaction_test.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ func TestTransactionByHashNotFound(t *testing.T) {
3636
txHash := new(felt.Felt).SetBytes([]byte("random hash"))
3737
mockReader.EXPECT().TransactionByHash(txHash).Return(nil, db.ErrKeyNotFound)
3838
mockSyncReader.EXPECT().PendingData().Return(nil, sync.ErrPendingBlockNotFound)
39+
mockReader.EXPECT().HeadsHeader().Return(nil, db.ErrKeyNotFound)
3940

4041
handler := rpc.New(mockReader, mockSyncReader, nil, "", nil)
4142

@@ -622,6 +623,7 @@ func TestTransactionReceiptByHash(t *testing.T) {
622623
txHash := new(felt.Felt).SetBytes([]byte("random hash"))
623624
mockReader.EXPECT().TransactionByHash(txHash).Return(nil, db.ErrKeyNotFound)
624625
mockSyncReader.EXPECT().PendingData().Return(nil, sync.ErrPendingBlockNotFound)
626+
mockReader.EXPECT().HeadsHeader().Return(nil, db.ErrKeyNotFound)
625627

626628
tx, rpcErr := handler.TransactionReceiptByHash(*txHash)
627629
assert.Nil(t, tx)
@@ -1434,6 +1436,7 @@ func TestTransactionStatus(t *testing.T) {
14341436
mockSyncReader := mocks.NewMockSyncReader(mockCtrl)
14351437
mockReader.EXPECT().TransactionByHash(notFoundTest.hash).Return(nil, db.ErrKeyNotFound).Times(2)
14361438
mockSyncReader.EXPECT().PendingData().Return(nil, sync.ErrPendingBlockNotFound).Times(2)
1439+
mockReader.EXPECT().HeadsHeader().Return(nil, db.ErrKeyNotFound).Times(2)
14371440
handler := rpc.New(mockReader, mockSyncReader, nil, "", log)
14381441
_, err := handler.TransactionStatus(ctx, *notFoundTest.hash)
14391442
require.Equal(t, rpccore.ErrTxnHashNotFound.Code, err.Code)
@@ -1452,6 +1455,7 @@ func TestTransactionStatus(t *testing.T) {
14521455
mockSyncReader := mocks.NewMockSyncReader(mockCtrl)
14531456
mockReader.EXPECT().TransactionByHash(test.notFoundTxHash).Return(nil, db.ErrKeyNotFound)
14541457
mockSyncReader.EXPECT().PendingData().Return(nil, sync.ErrPendingBlockNotFound)
1458+
mockReader.EXPECT().HeadsHeader().Return(nil, db.ErrKeyNotFound)
14551459
handler := rpc.New(mockReader, mockSyncReader, nil, "", log).WithFeeder(client)
14561460

14571461
_, err := handler.TransactionStatus(ctx, *test.notFoundTxHash)
@@ -1913,7 +1917,7 @@ func TestSubmittedTransactionsCache(t *testing.T) {
19131917
require.Nil(t, err)
19141918
mockReader.EXPECT().TransactionByHash(res.TransactionHash).Return(nil, db.ErrKeyNotFound)
19151919
mockSyncReader.EXPECT().PendingData().Return(nil, sync.ErrPendingBlockNotFound)
1916-
1920+
mockReader.EXPECT().HeadsHeader().Return(nil, db.ErrKeyNotFound)
19171921
status, err := handler.TransactionStatus(ctx, *res.TransactionHash)
19181922
require.Nil(t, err)
19191923
require.Equal(t, rpc.TxnStatusReceived, status.Finality)
@@ -1931,6 +1935,7 @@ func TestSubmittedTransactionsCache(t *testing.T) {
19311935
require.Nil(t, err)
19321936
mockReader.EXPECT().TransactionByHash(res.TransactionHash).Return(nil, db.ErrKeyNotFound)
19331937
mockSyncReader.EXPECT().PendingData().Return(nil, sync.ErrPendingBlockNotFound)
1938+
mockReader.EXPECT().HeadsHeader().Return(nil, db.ErrKeyNotFound)
19341939
// Expire cache entry
19351940
time.Sleep(cacheEntryTimeOut)
19361941
status, err := handler.TransactionStatus(ctx, *res.TransactionHash)

rpc/v9/block_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ func TestBlockTransactionCount(t *testing.T) {
129129
latestBlock.Hash = nil
130130
latestBlock.GlobalStateRoot = nil
131131
mockSyncReader.EXPECT().PendingData().Return(nil, sync.ErrPendingBlockNotFound)
132+
mockReader.EXPECT().HeadsHeader().Return(nil, db.ErrKeyNotFound)
132133
preConfirmed := blockIDPreConfirmed(t)
133134
count, rpcErr := handler.BlockTransactionCount(&preConfirmed)
134135
require.Equal(t, rpccore.ErrBlockNotFound, rpcErr)

rpc/v9/helpers.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ func (h *Handler) blockByID(blockID *BlockID) (*core.Block, *jsonrpc.Error) {
3838
switch blockID.Type() {
3939
case preConfirmed:
4040
var pending *core.PendingData
41-
pending, err = h.syncReader.PendingData()
41+
pending, err = h.PendingData()
4242
if err == nil {
4343
block = pending.GetBlock()
4444
}
@@ -68,7 +68,7 @@ func (h *Handler) blockHeaderByID(blockID *BlockID) (*core.Header, *jsonrpc.Erro
6868
switch blockID.Type() {
6969
case preConfirmed:
7070
var pending *core.PendingData
71-
pending, err = h.syncReader.PendingData()
71+
pending, err = h.PendingData()
7272
if err == nil {
7373
header = pending.GetBlock().Header
7474
}

0 commit comments

Comments
 (0)